2016-09-28 42 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. 

我的功能send_message会接收一条消息并将其发送到不一致的通道。 该函数是从线程中运行的函数调用的。客户端对象在主线程中创建。

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

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

回答

6

我只看过“事件循环运行的”例外当我打电话loop.run_until_complete上已经运行一个循环(在另一个线程,也许?)

如果循环已经在运行另一个线程并要提交一个协程为它来执行,使用:

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

如果您想协同程序添加到环路和环路当前线程上运行,那么最好的办法可能是到await/yield from,但如果你从一个同步的功能安排,那么你可能想:

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

哪里fn是其唯一参数的函数是可以被ensure_future创建和未来完成后,被称为未来。