2016-09-28 8 views
7

Występuje następujący błąd po wywołaniu funkcji send_message.Błąd wykonania: pętla zdarzeń jest uruchomiona

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. 

Moja funkcja send_message przyjmuje wiadomość i wysyła go do kanału niezgody. Funkcja jest wywoływana z funkcji działającej w wątku. Obiekt klienta jest tworzony w głównym wątku.

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

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

Odpowiedz

6

Mam tylko widziałem „Pętla zdarzeń jest uruchomiony” wyjątek gdy zgłoszę loop.run_until_complete na pętli, która jest już uruchomiony (w innym wątku, być może?)

Jeśli pętla jest już uruchomiony w inny wątek i chcesz złożyć współprogram za to wykonać, użyj:

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

Jeśli próbujesz dodać współprogram do pętli, a pętla jest uruchomiony w bieżącym wątku, to najlepszym sposobem jest prawdopodobnie po prostu await/yield from to, ale jeśli jesteś planowanie go z synchronicznym funkcji, to prawdopodobnie chcą:

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

Gdzie fn jest funkcją, której jedynym parametrem jest przyszłość, która jest tworzona przez ensure_future i nazywa się po przyszłość jest zakończona .