2016-09-28 4 views
7

関数send_messageを呼び出すと、次のエラーが発生します。ランタイムエラー:イベントループが実行中

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機能send_messageは、メッセージを受け取り、不和チャネルに送信します。 この関数は、スレッドで実行されている関数から呼び出されます。クライアントオブジェクトはメインスレッドで作成されます。

私は、私はすでに実行されているループ上 loop.run_until_completeを呼び出すときに例外を「イベントループが実行されている」を見てきました
def send_message(message): 
    print(str.encode("Message to discord: " + message)) 

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

答えて

6

(おそらく、別のスレッドでは?)

ループがすでに実行されている場合

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

あなたがループにコルーチンを追加しようとしていると、ループが現在のスレッド上で実行されている場合、最良の方法は、おそらくです:別のスレッドでは、あなたが使用は、それを実行するためのコルーチンを提出したいですちょうどawait/にそれを、しかし、あなたは、同期機能から、それをスケジュールしている場合、あなたはおそらくしたい:

fnはパラメータのみ ensure_futureにより作成されたの未来であり、将来が完了した後に呼び出される関数です
asyncio.ensure_future(
    client.send_message(SERVER, message), 
    loop=client.loop 
).add_done_callback(fn) 

関連する問題