我正在使用多线程脚本,其中Controller线程将不同数量的项目放入由多个其他Worker线程共享的类队列中。我正在寻找一种方法,让Controller类等待其他线程完成所有任务。我有类似下面的内容:
工人阶级
class Worker(threading.Thread):
q = queue.Queue()
evt_stop = threading.Event()
def task(self, *data):
result = data[1] + data[1]
data[0].q.put(result)
def __init__(self):
...
def run(self):
while not Worker.evt_stop.is_set():
if not Worker.q.empty():
data = Worker.q.get()
task(data[0], data[1])
Worker.q.task_done()
控制器类
class Controller(threading.Thread):
evt_stop = threading.Event()
def qsize(self, n):
if self.q.qsize() != n:
return False
else:
return True
def __init__(self):
self.q = queue.Queue()
self.await = threading.Condition()
def run(self):
r = [<list of unknown length>]
for i in r:
Worker.q.put(self, i)
with self.await:
if self.await.wait_for(lambda: self.qsize(len(r)), timeout=5.0):
while not self.q.empty():
x = self.q.get()
print(x)
self.q.task_done()
但是根据我对here提供的答案和说明的理解,lambda将始终返回True,因为返回的是函数对象,而不一定是值(“ self.test(1)是对象,该对象是调用方法的结果,该对象是布尔对象,而不是可调用对象”)。我理解正确吗?另外,我是否会使这个问题过于复杂,并且存在更简单的解决方案?
说明意图:
从本质上讲,这是一个脚本,它执行多个面向网络的功能。主线程运行一个菜单系统,用户可以从中选择不同的网络I / O任务。这些任务中的每一个都在单独的线程中运行,由控制器类的实例实例化。脚本首次运行时,将实例化一组工作线程,通常为4或6。该想法是用户可以选择一个实例化的控制器类对象,并且它将着手实现其逻辑,该逻辑涉及发送/接收数据。通过工作线程,然后修改该数据,并重复该过程。我要解决的问题是让控制器对象等到工作线程完成特定控制器实例放入共享工作程序类队列中的所有任务。由于要取决于第一个网络I / O任务的结果,因此事先不知道将要执行多少个任务。