2016-09-28 3 views
7

Ich bekomme den folgenden Fehler, wenn ich die Funktion send_message aufrufen.Laufzeitfehler: Ereignisschleife läuft

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner 
    self.run() 
    File "/usr/lib/python3.4/threading.py", line 868, in run 
    self._target(*self._args, **self._kwargs) 
    File "/home/joffe/Documents/discord/irc/ircbot.py", line 44, in get_message 
    mydiscord.send_message(line[1]) 
    File "/home/joffe/Documents/discord/irc/mydiscord.py", line 37, in send_message 
    client.loop.run_until_complete(client.send_message(SERVER,message)) 
    File "/usr/lib/python3.4/asyncio/base_events.py", line 331, in run_until_complete 
    self.run_forever() 
    File "/usr/lib/python3.4/asyncio/base_events.py", line 296, in run_forever 
    raise RuntimeError('Event loop is running.') 
RuntimeError: Event loop is running. 

My Funktion send_message nimmt eine Nachricht und sendet sie an eine Disharmonie Kanal. Die Funktion wird von einer Funktion aufgerufen, die in einem Thread ausgeführt wird. Das Clientobjekt wird im Hauptthread erstellt.

def send_message(message): 
    print(str.encode("Message to discord: " + message)) 

    client.loop.run_until_complete(client.send_message(SERVER,message)) 

Antwort

6

Ich habe nur die „Ereignisschleife läuft“ Ausnahme gesehen, als ich loop.run_until_complete auf einer Schleife aufrufen, die bereits ausgeführt wird (in einem anderen Thread, vielleicht?)

Wenn die Schleife läuft bereits in ein anderer Thread und Sie wollen eine Koroutine einreichen dafür, auszuführen Verwendung:

asyncio.run_coroutine_threadsafe(client.send_message(SERVER, message), client.loop) 

Wenn Sie eine Koroutine an die Schleife hinzuzufügen versuchen, und dass Schleife auf dem aktuellen Thread ausgeführt wird, dann der beste Weg ist wahrscheinlich zu nur await/yield from es, aber wenn man es von einer synchronen Funktion ist die Planung, dann mögen Sie wahrscheinlich:

asyncio.ensure_future(
    client.send_message(SERVER, message), 
    loop=client.loop 
).add_done_callback(fn) 

Wo fn eine Funktion nur deren Parameter sind die Zukunft, die von ensure_future erstellt wird und aufgerufen wird, nachdem die Zukunft abgeschlossen .