Python threading多线程编程实例


Posted in Python onSeptember 18, 2014

Python 的多线程有两种实现方法:

函数,线程类

1.函数

调用 thread 模块中的 start_new_thread() 函数来创建线程,以线程函数的形式告诉线程该做什么

# -*- coding: utf-8 -*-

import thread

def f(name):

  #定义线程函数

  print "this is " + name

 

if __name__ == '__main__':

  thread.start_new_thread(f, ("thread1",))

  #用start_new_thread()调用线程函数和其他参数

  while 1:

    pass

不过这种方法暂时没能找到其他辅助方法,连主线程等待都要用 while 1 这种方法解决。

2.线程类

调用 threading 模块,创建 threading.Thread 的子类来得到自定义线程类。

# -*- coding: utf-8 -*-

import threading

class Th(threading.Thread):

  def __init__(self, name):

    threading.Thread.__init__(self)

    self.t_name = name

    #调用父类构造函数

 

  def run(self):

    #重写run()函数,线程默认从此函数开始执行

    print "This is " + self.t_name

 

if __name__ == '__main__':

  thread1 = Th("Thread_1")

  thread1.start()

  #start()函数启动线程,自动执行run()函数

threading.Thread 类的可继承函数:
getName() 获得线程对象名称
setName() 设置线程对象名称
join() 等待调用的线程结束后再运行之后的命令
setDaemon(bool) 阻塞模式, True: 父线程不等待子线程结束, False 等待,默认为 False
isDaemon() 判断子线程是否和父线程一起结束,即 setDaemon() 设置的值
isAlive() 判断线程是否在运行

实例

import threading

import time

class Th(threading.Thread):

  def __init__(self, thread_name):

    threading.Thread.__init__(self)

    self.setName(thread_name)

 

  def run(self):

    print "This is thread " + self.getName()

    for i in range(5):

      time.sleep(1)

      print str(i)

    print self.getName() + "is over"

join() 阻塞等待

if __name__ == '__main__':

    thread1 = Th("T1 ")

    thread1.start()

    #thread1.join()

    print "main thread is over"

不带 thread1.join() ,得到如下结果:

This is thread T1

main thread is over

0

1

2

T1 is over

不等待 thread1 完成,执行之后语句。
加了 thread1.join() ,得到如下结果:
This is thread T1

0

1

2

T1 is over

main thread is over

阻塞等待 thread1 结束,才执行下面语句

主线程等待

if __name__ == '__main__':

  thread1 = Th("T1 ")

  thread1.setDaemon(True)

  #要在线程执行之前就设置这个量

  thread1.start()

  print "main thread is over"

报错: Exception in thread T1 (most likely raised during interpreter shutdown):
也就是主线程不等待子线程就结束了。

多个子线程

if __name__ == '__main__':

    for i in range(3):

        t = Th(str(i))

        t.start()

    print "main thread is over"

这里的 t 可同时处理多个线程,即 t 为线程句柄,重新赋值不影响线程。

这里奇怪的是,运行 t.run() 时,不会再执行其他线程。虽不明,还是用 start() 吧。暂且理解为 start() 是非阻塞并行的,而 run 是阻塞的。

线程锁

threading 提供线程锁,可以实现线程同步。

import threading

import time

class Th(threading.Thread):

  def __init__(self, thread_name):

    threading.Thread.__init__(self)

    self.setName(thread_name)

 

  def run(self):

    threadLock.acquire()

    #获得锁之后再运行

    print "This is thread " + self.getName()

    for i in range(3):

      time.sleep(1)

      print str(i)

    print self.getName() + " is over"

    threadLock.release()

    #释放锁

if __name__ == '__main__':

  threadLock = threading.Lock()

  #设置全局锁

  thread1 = Th('Thread_1')

  thread2 = Th('Thread_2')

  thread1.start()

  thread2.start()

得到结果:

This is thread Thread_1

0

1

2

Thread_1 is over

This is thread Thread_2

0

1

2

Thread_2 is over
Python 相关文章推荐
python实现中文分词FMM算法实例
Jul 10 Python
python3 shelve模块的详解
Jul 08 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
python实现txt文件格式转换为arff格式
May 31 Python
python爬取网易云音乐评论
Nov 16 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
解决使用export_graphviz可视化树报错的问题
Aug 09 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
python爬取音频下载的示例代码
Oct 19 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
Python中捕捉详细异常信息的代码示例
Sep 18 #Python
python字符串连接的N种方式总结
Sep 17 #Python
Python实现的检测web服务器健康状况的小程序
Sep 17 #Python
python写的一个squid访问日志分析的小程序
Sep 17 #Python
python进程管理工具supervisor使用实例
Sep 17 #Python
Python实现备份文件实例
Sep 16 #Python
Python多进程编程技术实例分析
Sep 16 #Python
You might like
用在PHP里的JS打印函数
2006/10/09 PHP
PHP define函数的使用说明
2008/08/27 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
python实现三种随机请求头方式
2021/01/05 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
英国网上花店:Bunches
2016/11/29 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
金融管理专业毕业生求职信
2014/03/12 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
公司经营目标责任书
2015/01/29 职场文书
采购员工作总结范文
2015/08/12 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
详解Python中*args和**kwargs的使用
2022/04/07 Python
Python  lambda匿名函数和三元运算符
2022/04/19 Python