在python

时间:2019-03-02 11:53:19

标签: python multithreading

我有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

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 之类的前哨值时干净地终止线程。