我在类中有一个方法,它打开与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)
答案 0 :(得分:0)
这是一个棘手的问题。
一种方法是在单独的线程中运行无限循环,并为该线程设置线程安全机制以与主线程通信(例如,通过使用Queues
来回发送数据一种线程安全的方式,或mutexes
以确保一个线程不会修改数据而另一个线程正在使用它。)
替代方法是以非阻塞方式使用库的API,以便您可以将其与主线程已经使用的任何事件循环集成。是否可行将取决于您的库为您提供的API;您可能想联系图书馆的作者(或者他们的开发人员的邮件列表,如果他们有的话),并询问他们是否有推荐的方法来处理这种情况。
第三种方法(在您的情况下可能或可能不实用)将运行无限循环,但在无限循环的每次迭代中调用一个函数,该函数运行主线程的正常事件循环的一次迭代。 (或相反亦然)。这样,每个代码库都可以运行其代码库的一次迭代,然后另一个代码库可以无限期地运行一次迭代,依此类推。