我正在尝试在基于现有库的两个协议之间建立桥接,基本上基于事件做某事(比如发送消息,或宣布它)。问题是一个库正在使用Gevent循环而另一个正在使用Asyncio循环,所以我无法使用内置循环功能在另一个循环上执行信号/事件操作,并且基本上无法访问另一个环。
如何在它们之间设置基于事件的通信?我似乎无法从现有的循环中访问其他循环。我觉得想要过度思考。 有没有办法通过多线程在循环之间共享对象来做到这一点?
示例代码:
import libraryBot1
import libraryBot2
bot1 = libraryBot1.Client()
bot2 = libraryBot2.Client()
@bot1.on('chat_message')
def handle_message(user, message_text):
bot2.send(message_text)
@bot2.on('send')
def handle_message(message_text):
print(message_text)
if __name__ == "__main__"
# If I login here, then its run_forever on behind the scenes
# So I cant reach second connection
bot1.login(username="username", password="password")
# Never reached
bot2.login(username="username", password="password")
如果我在另一边尝试使用多线程,那么它们都会启动,但它们无法互相访问(通信)。
答案 0 :(得分:1)
以下是仅使用gevent的示例。有可能将greenlets包装成与asyncio兼容的方式:
import gevent
from gevent.pool import Pool
from gevent.event import AsyncResult
a = AsyncResult()
pool = Pool(2)
def shared(stuff):
print(stuff)
pool.map(bot1.login, username="username", password="password", event=a, shared=shared)
pool.map(bot2.login, username="username", password="password", event=a, shared=shared)
# and then in both you could something like this
if event.get() == 'ready':
shared('some other result to share')
相关: