如何在不阻塞Python主线程的情况下运行无限循环?

时间:2018-04-01 02:29:48

标签: python multithreading infinite-loop

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

以下是需要运行的循环:

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)

1 个答案:

答案 0 :(得分:0)

这是一个棘手的问题。

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

替代方法是以非阻塞方式使用库的API,以便您可以将其与主线程已经使用的任何事件循环集成。是否可行将取决于您的库为您提供的API;您可能想联系图书馆的作者(或者他们的开发人员的邮件列表,如果他们有的话),并询问他们是否有推荐的方法来处理这种情况。

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