Python 多线程的实例详解

一)线程基础
1、创建线程:
thread模块提供了start_new_thread函数,用以创建线程。start_new_thread函数成功创建后还可以对其进行操作。
其函数原型:
start_new_thread(function,atgs[,kwargs])
其参数含义如下:
function: 在线程中执行的函数名
args:元组形式的参数列表。
kwargs: 可选参数,以字典的形式指定参数
方法一:通过使用thread模块中的函数创建新线程。
>>> import thread
>>> def run(n):
for i in range(n):
print i
>>> thread.start_new_thread(run,(4,)) #注意第二个参数一定要是元组的形式
53840
1
>>>
2
3
KeyboardInterrupt
>>> thread.start_new_thread(run,(2,))
17840
1
>>>
thread.start_new_thread(run,(),{'n':4})
39720
1
>>>
2
3
thread.start_new_thread(run,(),{'n':3})
32480
1
>>>
2
方法二:通过继承threading.Thread创建线程
>>> import threading
>>> class mythread(threading.Thread):
def __init__(self,num):
threading.Thread.__init__(self)
self.num = num
def run(self): #重载run方法
print 'I am', self.num
>>> t1 = mythread(1)
>>> t2 = mythread(2)
>>> t3 = mythread(3)
>>> t1.start() #运行线程t1
I am
>>> 1
t2.start()
I am
>>> 2
t3.start()
I am
>>> 3
方法三:使用threading.Thread直接在线程中运行函数。
import threading
>>> def run(x,y):
for i in range(x,y):
print i
>>> t1 = threading.Thread(target=run,args=(15,20)) #直接使用Thread附加函数args为函数参数
>>> t1.start()
15
>>>
16
17
18
19
二)Thread对象中的常用方法:
1、isAlive方法:
>>> import threading
>>> import time
>>> class mythread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
self.id = id
def run(self):
time.sleep(5) #休眠5秒
print self.id
>>> t = mythread(1)
>>> def func():
t.start()
print t.isAlive() #打印线程状态
>>> func()
True
>>> 1
2、join方法:
原型:join([timeout])
timeout: 可选参数,线程运行的最长时间
import threading
>>> import time #导入time模块
>>> class Mythread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
self.id = id
def run(self):
x = 0
time.sleep(20)
print self.id
>>> def func():
t.start()
for i in range(5):
print i
>>> t = Mythread(2)
>>> func()
0
1
2
3
4
>>> 2
def func():
t.start()
t.join()
for i in range(5):
print i
>>> t = Mythread(3)
>>> func()
3
0
1
2
3
4
>>>
3、线程名:
>>> import threading
>>> class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name=threadname)
def run(self):
print self.getName()
>>>
>>> t1 = mythread('t1')
>>> t1.start()
t1
>>>
4、setDaemon方法
在脚本运行的过程中有一个主线程,如果主线程又创建了一个子线程,那么当主线程退出时,会检验子线程是否完成。如果子线程未完成,则主线程会在等待子线程完成后退出。
当需要主线程退出时,不管子线程是否完成都随主线程退出,则可以使用Thread对象的setDaemon方法来设置。
三)线程同步
1.简单的线程同步
使用Thread对象的Lock和RLock可以实现简单的线程同步。对于如果需要每次只有一个线程操作的数据,可以将操作过程放在acquire方法和release方法之间。如:
# -*- coding:utf-8 -*-
import threading
import time
class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global x #设置全局变量
# lock.acquire() #调用lock的acquire方法
for i in range(3):
x = x + 1
time.sleep(2)
print x
# lock.release() #调用lock的release方法
#lock = threading.RLock() #生成Rlock对象
t1 = []
for i in range(10):
t = mythread(str(i))
t1.append(t)
x = 0 #将全局变量的值设为0
for i in t1:
i.start()
E:/study/<a href="http://lib.csdn.net/base/python" rel="external nofollow" class='replace_word' title="Python知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Python</a>/workspace>xianchengtongbu.py
3
6
9
12
15
18
21
24
27
30
如果将lock.acquire()和lock.release(),lock = threading.Lock()删除后保存运行脚本,结果将是输出10个30。30是x的最终值,由于x是全局变量,每个线程对其操作后进入休眠状态,在线程休眠的时候,Python解释器就执行了其他的线程而是x的值增加。当所有线程休眠结束后,x的值已被所有线修改为了30,因此输出全部为30。
2、使用条件变量保持线程同步。
python的Condition对象提供了对复制线程同步的支持。使用Condition对象可以在某些事件触发后才处理数据。Condition对象除了具有acquire方法和release的方法外,还有wait方法、notify方法、notifyAll方法等用于条件处理。
# -*- coding:utf-8 -*-
import threading
class Producer(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global x
con.acquire()
if x == 1000000:
con.wait()
# pass
else:
for i in range(1000000):
x = x + 1
con.notify()
print x
con.release()
class Consumer(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global x
con.acquire()
if x == 0:
con.wait()
#pass
else:
for i in range(1000000):
x = x - 1
con.notify()
print x
con.release()
con = threading.Condition()
x = 0
p = Producer('Producer')
c = Consumer('Consumer')
p.start()
c.start()
p.join()
c.join()
print x
E:/study/python/workspace>xianchengtongbu2.py
1000000
0
0
线程间通信:
Event对象用于线程间的相互通信。他提供了设置信号、清除信宏、等待等用于实现线程间的通信。
1、设置信号。Event对象使用了set()方法后,isSet()方法返回真。
2、清除信号。使用Event对象的clear()方法后,isSet()方法返回为假。
3、等待。当Event对象的内部信号标志为假时,则wait()方法一直等到其为真时才返回。还可以向wait传递参数,设定最长的等待时间。
# -*- coding:utf-8 -*-
import threading
class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global event
if event.isSet():
event.clear()
event.wait() #当event被标记时才返回
print self.getName()
else:
print self.getName()
event.set()
event = threading.Event()
event.set()
t1 = []
for i in range(10):
t = mythread(str(i))
t1.append(t)
for i in t1:
i.start()
如有疑问请留言或者到本站社区交流讨论,感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Python
# 多线程
# 多线程的详解
# python 对类的成员函数开启线程的方法
# python并发编程之线程实例解析
# python回调函数中使用多线程的方法
# Python开启线程
# 在函数中开线程的实例
# 还可以
# 对其
# 全局变量
# 可选
# 时才
# 放在
# 如有
# 已被
# 设为
# 其他的
# 会在
# 希望能
# 将是
# 第二个
# 只有一个
# 可以实现
# 谢谢大家
# 则可
# 后才
# 方法来
相关文章:
香港服务器网站卡顿?如何解决网络延迟与负载问题?
制作网站外包平台,自动化接单网站有哪些?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
购物网站制作公司有哪些,哪个购物网站比较好?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
建站之星如何通过成品分离优化网站效率?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
定制建站哪家更专业可靠?推荐榜单揭晓
如何在万网主机上快速搭建网站?
建站之星会员如何解锁更多建站功能?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
北京专业网站制作设计师招聘,北京白云观官方网站?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何快速生成可下载的建站源码工具?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
网站图片在线制作软件,怎么在图片上做链接?
,交易猫的商品怎么发布到网站上去?
定制建站流程步骤详解:一站式方案设计与开发指南
建站VPS推荐:2025年高性能服务器配置指南
Android使用GridView实现日历的简单功能
如何选择高效响应式自助建站源码系统?
建站之星各版本价格是多少?
如何快速搭建FTP站点实现文件共享?
网页设计网站制作软件,microsoft office哪个可以创建网页?
太平洋网站制作公司,网络用语太平洋是什么意思?
,如何利用word制作宣传手册?
香港服务器部署网站为何提示未备案?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
制作网站的公司有哪些,做一个公司网站要多少钱?
建站168自助建站系统:快速模板定制与SEO优化指南
Java解压缩zip - 解压缩多个文件或文件夹实例
西安专业网站制作公司有哪些,陕西省建行官方网站?
三星网站视频制作教程下载,三星w23网页如何全屏?
如何选择美橙互联多站合一建站方案?
测试制作网站有哪些,测试性取向的权威测试或者网站?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何快速辨别茅台真假?关键步骤解析
打鱼网站制作软件,波克捕鱼官方号怎么注册?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用PHP快速搭建CMS系统?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何在云虚拟主机上快速搭建个人网站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
公司网站制作价格怎么算,公司办个官网需要多少钱?
建站之星安装失败:服务器环境不兼容?
动图在线制作网站有哪些,滑动动图图集怎么做?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
*请认真填写需求信息,我们会在24小时内与您取得联系。