2016-09-28 32 views
7

send_message işlevini çağırdığımda aşağıdaki hatayı alıyorum.Çalışma zamanı hatası: Olay döngüsü çalışıyor

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. 

Benim işlevi send_message bir ileti alır ve bir anlaşmazlık kanalına gönderir. İşlev, iş parçacığı içinde çalışan bir işlevden çağrılır. İstemci nesnesi ana iş parçacığında oluşturulur.

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

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

cevap

6

Ben sadece zaten çalıştıran bir döngü loop.run_until_complete çağırdığınızda istisna "Olay döngü çalışıyor" gördüğüm (başka bir iş parçacığı belki?)

döngü zaten çalışıyorsa

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

Eğer döngü bir eşyordam eklemeye çalıştığınız ve bu döngü akımı parçacığı üzerinde çalışıyorsa, o zaman en iyi yolu muhtemelen: başka bir iş parçacığı ve kullanımı, bu yürütmesi için bir eşyordam göndermek istediğiniz sadece await/Bir senkron işlevinden bunu Plan oluşturduğunuz eğer, ancak, o zaman muhtemelen istediğiniz: fn tek parametre bir işlev olduğunu

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

ensure_future tarafından oluşturulan oluyor ve gelecek tamamlandıktan sonra denir geleceği .

İlgili konular