我正在使用Queue doc page底部的队列实现,我有几个问题:
共有50个线程,它们可以获取数十万个JSON文件。将Queue(maxsize=
设置为线程数的两倍是一个好主意,还是应该更多或更少?
我想将worker
函数放在不同的模块中。我该怎么办呢?当我尝试这样做时,我会在函数的NameError: global name 'q' is not defined
行中得到item = q.get()
;将global q
添加到该函数无济于事。
编辑:是否可以将工作人员功能移动到另一个模块,而对该代码的更改最少?我并不是很了解那些对象,我宁愿保持代码尽可能简单。
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()
答案 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是一个类(一个共享队列的线程)。 主类用于创建工作程序,从而加载工作线程所需的数据。
希望这会有所帮助