2017-06-11 2 views
0

J'essaie de construire un pont entre deux protocoles basés sur des bibliothèques existantes, essentiellement faire quelque chose en fonction de l'événement (comme transmettre un message, ou l'annoncer). Le problème est qu'une bibliothèque utilise la boucle Gevent et l'autre utilise la boucle Asyncio, donc je ne suis pas capable d'utiliser la fonctionnalité de boucle intégrée pour faire des actions signal/événement sur l'autre boucle, et fondamentalement pas moyen d'accéder à l'autre boucle.asyncio et gevent loops - comment communiquer les uns avec les autres?

Comment configurer la communication basée sur les événements entre eux? Je n'arrive pas à accéder à l'autre boucle depuis l'existant. J'ai envie de trop penser. Existe-t-il un moyen de le faire via le multithreading en partageant des objets entre des boucles?

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

Si je l'autre côté essaie d'utiliser multithreading, puis tous les deux sont mis en marche, mais ils ne peuvent pas accéder à l'autre (communiquer).

+0

pouvez-vous ajouter le correspondant des morceaux de code? – jmunsch

+0

Ajouté un exemple de code, j'espère que cela aide à comprendre mon problème. – dimon222

Répondre

1

Voici un exemple utilisant seulement gevent. Il pourrait être possible d'envelopper les greenlets de telle sorte qu'il serait compatible avec 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') 

liés: