最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

python单条线程多次执行任务的思考

Python 4171浏览 0评论

在项目中,有时需要并发处理多个任务,可以使用多线程技术。但是由于机器限制,不能说有多少个任务,就开启多少个线程,那么这里就涉及到单条线程多次执行任务的方法。例如有1万个任务,开启30条线程来处理,每个线程处理完一个任务,就继续处理下一个任务,直到任务全部执行完毕。

思路:

重写threading.Thread类的run方法。因为线程在start之后,就会执行run方法,执行完这个方法后线程就会join退出,所以我就想到了改写run方法来实现。

以下是代码演示:

实例场景:假设有10000个任务在队列里,开启30个线程来循环执行任务,每次执行完一个任务,都从队列里删除这个任务,直到任务全部结束。下面代码在python 2.7.3上成功执行,注释都写在代码里了:

#!/usr/bin/env python
#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():
    #开启30条线程来执行
    threads = []
    nloops = range(30)

    for i in nloops:
        t = MyThread(foo)
        threads.append(t)

    for i in nloops:
        threads[i].start()

    for i in nloops:
        threads[i].join()

if __name__ == '__main__':
    main()

执行这个文件,屏幕上会输出一堆字符串,这个估计也看不清,不用管,打开日志文件log.txt查看。以下是我的日志文件结果,正好1万条数据,其中你会发现task不是按照顺序执行,这个是因为线程之间本来就是异步的,只要任务之间没有关联,是没有关系的。

python中单条线程多次执行任务

python中单条线程多次执行任务

转载请注明:快乐编程 » python单条线程多次执行任务的思考

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址