改写了一个利用Queue多线程完成工作的脚本,大家来挑挑刺儿。

改写了一个利用Queue多线程完成工作的脚本,大家来挑挑刺儿。



[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python
import Queue
import threading
import time
import random

q=Queue.Queue(0)
NUM_WORKERS = 3

class MyThread(threading.Thread):
    """A worker thread."""
    def __init__(self, input, worktype):
        self._jobq = input
        self._work_type = worktype
        threading.Thread.__init__(self)
    def run(self):
        """
        Get a job and process it. Stop when there's no more jobs
        """
        while True:
            if self._jobq.qsize()>0:
                job = self._jobq.get()
                worktype=self._work_type
                self._process_job(job,worktype)
            else:
                break
    def _process_job(self, job,worktype):
        """
        Do useful work here.
        worktype: let this thread do different work
        1,do list
        2,do item
        3,,,
        """
        doJob(job)
        
def doJob(job):
    """
    do work function 1
    """
    time.sleep(random.random()*3)
    print "doing ",job
if __name__=='__main__':

    print "begin..."
    #put some work to q
    for i in range(NUM_WORKERS*2):
        q.put(i)
    #print total job q's size
    print "job q'size",q.qsize()
    #start threads to work
    for x in range(NUM_WORKERS):
        MyThread(q,x).start()
    #if q is not empty, wait
    #while q.qsize()>0:
    #    time.sleep(0.1)

有点疑惑的是为啥
MyThread(q,x).start()
后,程序不结束,一直等所有的q里面的job被完成才退出?
thread.start_new_thread起来的线程好像是不行的。
继承threading后的线程莫非已经用了join方法么?
一般来说,做成一个守护程序不是这么简单的。在linux下可以简单地使用 & 实现后台运行。在 windows 下一般需要写成 services 才可以。而整个程序的退出有时并不是主线程退出就可以了。不过具体怎么做我也没有做过。
没想写守护进程,就是想多线程完成一批工作。
那就应该等子线程全部结束再退出啊。