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实现类似ftp传输文件的网络程序示例
Apr 08 Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
python基于queue和threading实现多线程下载实例
Oct 08 Python
Linux下Python获取IP地址的代码
Nov 30 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
详解django三种文件下载方式
Apr 06 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
python 保存float类型的小数的位数方法
Oct 17 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
python读取Excel表格文件的方法
Sep 02 Python
什么是python的必选参数
Jun 21 Python
Python Process创建进程的2种方法详解
Jan 25 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
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
基于JavaScript代码实现微信扫一扫下载APP
2015/12/30 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
Python中itertools模块用法详解
2014/09/25 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
用python对excel查重
2020/12/07 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
美国零售商店:Blue&Cream
2017/04/07 全球购物
维也纳通行证:Vienna PASS
2019/07/18 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
应届生面试求职信
2014/07/02 职场文书
合作协议书格式
2014/08/19 职场文书
出纳岗位职责范本
2015/03/31 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
使用python绘制横竖条形图
2022/04/21 Python