如何 运行 无限循环而不阻塞 Python 中的主线程?

How to run an infinite loop without blocking the main thread in Python?

我在 class 中有一个方法可以打开与 API 的连接,然后侦听更改。侦听更改是使用无限循环完成的,该循环从我正在使用的 API 连接的库中的方法接收事件。唯一的问题是无限循环阻塞了主线程,主线程需要 运行 其他东西。我曾尝试使用线程,但是 for 循环需要访问我的 class 中的变量以设置从 API 接收到的更改。我需要一种方法来 运行 这个无限循环而不阻塞主线程,但仍然能够在主线程的 class 中设置 class 变量。

这是需要的循环 运行:

for event in events():
        event_type = event.event
        print(event_type)
        if event_type == 'open':
            pass
        elif event_type == 'put':
            # this sets the class variable
            self._status = json.loads(event.data)
        elif event_type == 'auth_revoked':
            raise AuthorizationError(None, msg='The API authorization has been revoked')
        elif event_type == 'error':
            raise APIError(None, msg=event.data)

这是个棘手的问题。

一种方法是 运行 在单独的线程中无限循环,并为该线程设置 thread-safe 机制以与主线程通信(例如通过使用 Queues 以 thread-safe 方式来回发送数据,或 mutexes 以确保一个线程不会在另一个线程使用数据时修改数据)。

替代方法是以 non-blocking 方式使用库的 API,这样您就可以将它与主线程已经使用的任何事件循环集成。这是否可能在很大程度上取决于 API 您的图书馆提供给您使用;您可能想联系库的作者(或者他们的开发人员的邮件列表,如果有的话)并询问他们是否有推荐的方法来处理这种情况。

第三种方法(在您的情况下可能可行也可能不可行)是 运行 无限循环,但在无限循环的每次迭代中调用一个 运行s 的函数主线程的正常事件循环的一次迭代。 (或相反亦然)。这样一来,每个代码库都会对其代码库进行 运行 一次迭代,然后另一个代码库会进行 运行 一次迭代,依此类推,无限期地进行。