在项目中,有时需要并发处理多个任务,可以使用多线程技术。但是由于机器限制,不能说有多少个任务,就开启多少个线程,那么这里就涉及到单条线程多次执行任务的方法。例如有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()