在Python中排队线程

时间:2013-01-05 17:31:55

标签: python multithreading queue

我正在使用Queue doc page底部的队列实现,我有几个问题:

  1. 共有50个线程,它们可以获取数十万个JSON文件。将Queue(maxsize=设置为线程数的两倍是一个好主意,还是应该更多或更少?

  2. 我想将worker函数放在不同的模块中。我该怎么办呢?当我尝试这样做时,我会在函数的NameError: global name 'q' is not defined行中得到item = q.get();将global q添加到该函数无济于事。

  3. 编辑:是否可以将工作人员功能移动到另一个模块,而对该代码的更改最少?我并不是很了解那些对象,我宁愿保持代码尽可能简单。

    def worker():
        while True:
            item = q.get()
            do_work(item)
            q.task_done()
    
    q = Queue()
    for i in range(num_worker_threads):
         t = Thread(target=worker)
         t.daemon = True
         t.start()
    
    for item in source():
        q.put(item)
    
    q.join()      
    

1 个答案:

答案 0 :(得分:1)

你可以试试这样的事情

class Worker(threading.Thread):
    def __init__(self,inputQueue,inputLock):
        threading.Thread.__init__(self)
        self.inputQueue=inputQueue
        self.inputLock=inputLock          

    def run(self):       
        while True:
            if not self.inputQueue.empty():
                self.inputLock.acquire()
                item=self.inputQueue.get()
                self.inputLock.release()
        #process item
                self.inputQueue.task_done()
            else:
                time.sleep(1)

class Main():

    def __init__(self):
        self.workersQueue = Queue.Queue()
        self.workersLock = threading.RLock()
        self.workers = list()

        #start threads
        for index in range(10):            
            self.uploaders.append(Worker(self.workersQueue, self.workersLock))
            self.uploaders[index].start()

        self.workersQueue.join()

这里worker是一个类(一个共享队列的线程)。 主类用于创建工作程序,从而加载工作线程所需的数据。

希望这会有所帮助