通过 Python 定期向多个线程传递更新的 args

2024-09-28 22:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个基站,它们必须并行工作,每10秒它们会收到一个列表,其中包含关于它们集群的信息,我想运行这个代码大约10分钟。因此,每10秒我的三个线程就必须用新参数调用目标方法,这个过程应该持续10分钟。我不知道如何做到这一点,但我想出了下面的想法,这似乎不是一个很好的一个!所以我很感激你的帮助。你知道吗

我有一个名为base\u centroid\u assign的列表,我想把它的每一项传递给一个不同的线程。列表内容将经常更新(假设为10秒),因此我希望回忆我以前的线程,并将更新项提供给它们。你知道吗

在下面的代码中,列表包含三个项目,其中包含多个项目(嵌套)。我想在执行非常简单的目标函数后停止三个线程,然后用update item调用线程;但是,当我运行下面的代码时,我得到了30个线程!(运行时间变量为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

Tags: 项目run代码目标列表basetimestatus
1条回答
网友
1楼 · 发布于 2024-09-28 22:25:29

欢迎使用Stackoverflow。你知道吗

线程同步的问题处理起来非常棘手,以至于Python已经有了一些非常有用的库来专门处理这些任务。这样的主要库是python3中的queue.Queue。其思想是为每个“工作者”线程设置一个队列。主线程收集并put新数据到队列中,并让子线程get从该队列中获取数据。你知道吗

当您调用Queueget方法时,它的正常操作是阻塞线程,直到有可用的内容,但您可能希望线程继续处理当前的输入,直到有新的输入可用为止,在这种情况下,如果主线程中没有任何数据,则轮询队列并继续处理当前数据更有意义。你知道吗

我在对this question的回答中概述了这种方法,不过在这种情况下,工作线程实际上是在另一个队列上发送返回值。你知道吗

工作线程的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

您可能希望添加逻辑,以便在接收到None等sentinel值时干净地终止线程。你知道吗

相关问题 更多 >