Python中是否有内置的跨线程事件?

10

在Python中,是否有内置的语法可以让我向特定的Python线程发布消息?就像PyQt中的“queued connected signal”或Windows中的::PostMessage()一样。我需要这样做来实现程序部分之间的异步通信:有许多线程处理网络事件,它们需要将这些事件发布到一个单独的“逻辑”线程中,以安全的单线程方式转换事件。

2个回答

11

队列(Queue)模块非常适用于你所描述的情况。

你可以设置一个队列,让所有线程共享。处理网络事件的线程可以使用queue.put将事件发布到队列中,而逻辑线程则可以使用queue.get从队列中获取事件。

import Queue
# maxsize of 0 means that we can put an unlimited number of events
# on the queue
q = Queue.Queue(maxsize=0)

def network_thread():
    while True:
        e = get_network_event()
        q.put(e)

def logic_thread():
    while True:
        # This will wait until there are events to process
        e = q.get()
        process_event(e)

谢谢!有没有办法在事件中放置一个函数调用?实际的线程代码调用函数,如PostConnectionStatus(STATUS),而工作线程具有处理程序(例如OnConnectionStatus(i_status))。有没有办法通过事件自动编排函数调用? - grigoryvp
在Python中,函数像其他所有对象一样是对象,因此可以像其他对象一样传递。因此,您也可以附加要与事件一起调用的函数,例如q.put((e, PostConnectionStatus))。然后,您的逻辑线程可以执行"e,func = q.get()"。这有帮助吗? - Chris AtLee
当然,谢谢。可变数量的参数可以以相同的方式进行编组吗? - grigoryvp
是的。您可以将任何Python对象放入队列中,因此可以添加包含事件、函数和参数的元组或列表,也可以添加字典或您编写的类。 - Chris AtLee

1

我不太确定你在寻找什么。但是肯定没有内置的语法可以实现这个功能。可以看一下 queuethreading 模块。这里有很多有用的东西,如队列、条件、事件、锁和信号量,可以用来实现各种同步和异步通信。


我正在寻找一种简单的方法,在一个线程中调用一个函数,并在另一个线程中调用链接函数(排队委托)。同步原语将强制手动完成所有操作,这需要大量的代码吗? - grigoryvp
1
@Eye of Hell:请仔细阅读队列模块文档。在线程之间看起来像是“调用函数”的东西通常是一个请求队列从一个线程传递到另一个线程;接收线程出队请求并调用该函数。 - S.Lott
啊,我记得,在Python中函数是一等对象(内置委托)。有没有什么众所周知的语法可以将“函数调用”放入队列中,并在实际线程中进行实际调用?那么函数参数编组呢? - grigoryvp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接