dimon222
dimon222

Reputation: 172

asyncio and gevent loops - how to communicate between each other?

I'm trying to build bridge between two protocols based on existing libraries, basically do something based on event (like transmit message, or announce it). The problem is that one library is using Gevent loop and the other is using Asyncio loop, so I'm not able to use built-in loop functionality to do signal/event actions on the other loop, and basically no way to access the other loop.

How to setup event-based communication between them? I can't seem to access the other loop from within existing one. I feel like overthinking. Is there some way to do it via multithreading by sharing objects between loops?

Sample code:

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")

If I on the other side try to use multithreading, then both of them are started, but they can't access each other (communicate).

Upvotes: 0

Views: 1540

Answers (1)

jmunsch
jmunsch

Reputation: 24099

Here is an example using only gevent. It might be possible to wrap the greenlets in such a way that it would be compatible with 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')

related:

Upvotes: 2

Related Questions