我有3个基站,它们必须并行工作,并且每隔10秒就会收到一个列表,其中包含有关其集群的信息,我希望将此代码运行大约10分钟。因此,每隔10秒,我的三个线程就必须使用新参数调用目标方法,并且此过程将持续10分钟。我不知道该怎么做,但是我提出了以下想法,但似乎不是一个好主意!因此,我感谢您的帮助。
我有一个名为 base_centroid_assign 的列表,我想将其每个项目传递给不同的线程。列表内容将经常更新(假设为10秒),所以我想回想一下我以前的线程并为它们提供更新项。
在下面的代码中,列表包含三个项目,其中包含多个项目(嵌套)。我想让三个线程在执行相当简单的目标函数后停止,然后使用更新项调用线程;但是,当我运行以下代码时,最终得到了30个线程! ( run_time 变量为10,列表长度为3)。
如何实现上述想法?
run_time = 10
def cluster_status_broadcasting(info_base_cent_avr):
print(threading.current_thread().name)
info_base_cent_avr.sort(key=lambda item: item[2], reverse=True)
start = time.time()
while(run_time > 0):
for item in base_centroid_assign:
t = threading.Thread(target=cluster_status_broadcasting, args=(item,))
t.daemon = True
t.start()
print('Entire job took:', time.time() - start)
run_time -= 1
答案 0 :(得分:0)
欢迎使用Stackoverflow。
线程同步问题可能很难处理,以至于Python已经有了一些非常有用的库来专门处理此类任务。这样的库主要是Python 3中的queue.Queue
。这个想法是为每个“工作者”线程都有一个队列。主线程将新数据收集并put
放入队列,并让辅助线程get
从该队列中收集数据。
当调用Queue
的{{1}}方法时,其通常的操作是阻塞线程,直到有可用的东西为止,但是大概您希望线程继续在当前输入上工作,直到有新的输入可用为止。可用,在这种情况下,如果主线程没有任何内容,则轮询队列并继续使用当前数据会更有意义。
我在对this question的回答中概述了这种方法,尽管在这种情况下,工作线程实际上是将返回值发送回另一个队列。
工作线程的get
方法的结构将需要类似于以下伪代码:
run
您可能想添加逻辑以在收到诸如def run(self):
request_data = self.inq.get() # Wait for first item
while True:
process_with(request_data)
try:
request_data = self.inq.get(block=False)
except queue.Empty:
continue
之类的前哨值时干净地终止线程。