【问题标题】:Python child thread to communicate the caller via eventPython子线程通过事件与调用者通信
【发布时间】:2015-05-11 23:46:36
【问题描述】:

相关:Catch a thread's exception in the caller thread in Python

当我在子线程中捕获异常时:
我需要让线程调用者知道

在相关帖子中,接受的答案检查队列这很好,但它阻止了主调用者做任何其他事情,因为它一直在检查队列

如果它是基于事件的,那将是理想的。

解决方案应该是:主调用者做事(不连续检查子线程中的队列是否有错误),如果子线程内部出现问题,子线程通过一些事件让主调用者知道,主调用者​​处理错误。

我一直在查看不同的文章和解决方案,但所有事件内容都针对与子线程通信的主调用者,反之亦然

子线程通过事件与调用者通信的任何解决方案?

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    没有“线程调用者”这样的东西。所有线程都是平等的。

    在你的脑海中,“主线程”是一种特殊的东西,因为 Python 免费为你提供了它,但就 Python 而言,主线程就像任何其他线程一样。

    所以您的问题归结为:如何在两个线程之间交换信息?

    有一个或多个队列。

    通常,伪代码如下所示:

    1. 创建 N 个工作器,连接到输入和输出队列。
    2. 将工作放入输入队列
    3. 等待输出队列中的结果
    4. 加入主题

    请注意,您不必在第 3 步中阻止。您还可以询问队列是否有任何元素。如果是这样,那么get() 将不会阻止。如果它是空的,那么你可以做其他事情。

    第 4 步通常更容易实现,当您定义一个“kill”命令时,线程会以“I'm done”回复对其进行响应。

    然后您可以发送 N 个 kill 命令并等待 N 个回复。之后,您可以确定所有线程都已完成。

    【讨论】:

    • 调用 threading.Thread() 的人就是调用者所说的
    • 我知道 get 可能是非阻塞的,但是......那么你必须问我是否必须在程序运行的整个过程中检查队列?这听起来像是一个糟糕的解决方案
    • 你多久检查一次,什么时候检查等等。如果它基于事件,那么你不必回答这些问题
    猜你喜欢
    • 2017-07-08
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多