python 多线程+queue
短信预约 -IT技能 免费直播动态提醒
python的queue设计的是线程安全的,所以大家伙放心用吧!
python多线程的一种简单的实现如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
def fun(argv):
print 'in', argv
time.sleep(2)
threads = [] #用于保存线程
for i in range(5): #开5个线程
t = threading.Thread(target = fun, args = str(i))
threads.append(t)
if __name__ == '__main__':
#开始所有的线程
for i in threads:
i.start()
#保证线程执行完
for i in threads:
i.join()
print 'all over'
程序执行结果如下
使用threading可以很容易的开启多线程,join的作用是用于线程同步,看自己的需求而定。
好了,现在进入正题,多线程+queue怎么弄,先给出代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import Queue
import threading
import time
Thread_id = 1
Thread_num = 3
class myThread(threading.Thread):
def __init__(self, q):
global Thread_id
threading.Thread.__init__(self)
self.q = q
self.Thread_id = Thread_id
Thread_id = Thread_id + 1
def run(self):
while True:
try:
task = self.q.get(block = True, timeout = 1) #不设置阻塞的话会一直去尝试获取资源
except Queue.Empty:
print 'Thread' , self.Thread_id , 'end'
break
#取到数据,开始处理(依据需求加处理代码)
print "Starting " , self.Thread_id
print task
self.q.task_done()
print "Ending " , self.Thread_id
q = Queue.Queue(10)
#向资源池里面放10个数用作测试
for i in range(10):
q.put(i)
#开Thread_num个线程
for i in range(0, Thread_num):
worker = myThread(q)
worker.start()
q.join() #等待所有的队列资源都用完
print "Exiting Main Thread"
结果如下
是不是感觉很乱,哈哈没关系,这才是多线程的魅力所在!你永远不知道是从哪个线程开始。
在这里Queue作为资源池,线程去从资源池中取数据进行处理,可是为什么需要用到Queue呢, 因为可能资源池很大,而开的线程数有限,所以等一个线程处理完它的任务之后,它可以继续去取资源处理!这就可以让先执行完一个任务的线程不立即停下来,而是去取另一个资源处理,直到没有数据的时候它才会停下来。简单理解:q.task_done是表明当前的资源处理完了,q.join()会等到所有的资源都被处理了才会向下继续执行,这就是一种同步。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341