我正在使用 Queue doc page 底部的队列实现,我有几个问题:
有 50 个线程,它们提取数十万个 JSON 文件。将
Queue(maxsize=
设置为线程数的两倍是个好主意,还是应该更多或更少?我想将
worker
函数放在不同的模块中。我该怎么办?当我尝试这样做时,我在函数的item = q.get()
行中得到NameError: global name 'q' is not defined
;向函数添加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()
最佳答案
你可以试试这样的东西
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 是一个类(一个线程,队列被共享)。 主类用于创建工作线程,从而加载工作线程所需的数据。
希望对你有帮助
关于python - 在 Python 中排队线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174437/