python单条线程多次执行任务
2014-03-24 21:32
Python
多线程
Queue
任务队列
摘要:机器资源有限,不能无限开线程,分享一下我用 Queue + threading 实现单条线程循环处理多个任务的方法。
在项目中,有时需要并发处理多个任务,可以使用多线程技术。但是由于机器限制,不能说有多少个任务,就开启多少个线程,那么这里就涉及到单条线程多次执行任务的方法。例如有1万个任务,开启10条线程来处理,每个线程处理完一个任务,就继续处理下一个任务,直到任务全部执行完毕。 假设有10000个任务在队列里,开启10个线程来循环执行任务,每次执行完一个任务,都从队列里删除这个任务,直到任务全部结束。
#coding=utf8
import threading
from Queue import Queue
# 假设有10000个任务
myqueue = Queue(10000)
for i in range(10000):
myqueue.put('task%d' % (i + 1))
'''
任务执行方法,任务执行完成就被移除
以下只是简单输出任务执行字符串,并记录日志
'''
def foo():
try:
task = myqueue.get_nowait()
except Exception, e:
pass
print '%s execute!' % task
logfile = open('log.txt', 'a')
print >> logfile, '%s finish!' % task
logfile.close()
# 自定义线程类,继承threading.Thread
class MyThread(threading.Thread):
def __init__(self, func, args=(), name=''):
super(MyThread, self).__init__(target=func, args=args, name=name)
self.name = name
self.func = func
self.args = args
'''
重写threading.Thread的run方法
在这个方法中,会循环检测myqueue是否还有任务
'''
def run(self):
while myqueue.qsize() > 0:
self.func()
# 主方法
def main():
# 开启10条线程来执行
threads = []
nloops = range(10)
# 循环创建10个线程对象并加入列表
for i in nloops:
t = MyThread(foo)
threads.append(t)
# 依次运行10个线程
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
if __name__ == '__main__':
main()