2016-07-04 3 views
-1

私は、複数のサイトのステータスを監視するPythonスクリプトをコーディングしています。
他のウェブサイトのチェックでブロックされることなく、正確な間隔でウェブサイトのステータスをチェックするはずだから、私はasyncioを使っています。
しかし、私はSIGINTシグナルを捕まえたときに正しく停止しないか、間違ってすべてやっているようです。asyncioを使ってこのpythonコードをクリアして改善するには?

/usr/lib/python3.5/asyncio/unix_events.py:129: RuntimeWarning: coroutine 'exit_sigint' was never awaited 
    del self._signal_handlers[sig] 
exception calling callback for <Future at 0x7f146da3ee80 state=finished returned list> 
Traceback (most recent call last): 
    File "/usr/lib/python3.5/concurrent/futures/_base.py", line 297, in _invoke_callbacks 
    callback(self) 
    File "/usr/lib/python3.5/asyncio/futures.py", line 442, in _call_set_state 
    dest_loop.call_soon_threadsafe(_set_state, destination, source) 
    File "/usr/lib/python3.5/asyncio/base_events.py", line 532, in call_soon_threadsafe 
    handle = self._call_soon(callback, args) 
    File "/usr/lib/python3.5/asyncio/base_events.py", line 506, in _call_soon 
    self._check_closed() 
    File "/usr/lib/python3.5/asyncio/base_events.py", line 334, in _check_closed 
    raise RuntimeError('Event loop is closed') 
RuntimeError: Event loop is closed 

ソースコード:
https://github.com/DasFranck/Python-Mineur/blob/master/awsum_py/awsum.py

私は何を変更する必要があります、と私は正確に何をやっていますか? asyncio docによると

答えて

1

ensure_futureスケジュールコルーチンオブジェクトの実行:将来的にそれを包みます。 Taskオブジェクトを返します。

あなたのコールバックはループによって管理されるコルーチンを実行しますが、決してrun_until_completeなので決して終了するのを待つことはありません。実際、このようなコールバックをラップすることで、run_until_completeを呼び出すことはできません。

とにかく、コールバックは非同期である必要はありませんので、あなたはちょうどこのようにそれらを使用することができます:未来にそれらをラップすることなく、

# exit_sigint doesn't even need the loop as a parameter 
def exit_sigint(signame): 
    print("%s catched, exiting..." % signame) 
    for task in asyncio.Task.all_tasks(): 
    task.cancel() 

loop.add_signal_handler(getattr(signal, "SIGINT"), exit_sigint, "SIGINT") 
loop.add_signal_handler(getattr(signal, "SIGTERM"), exit_sigint, "SIGTERM") 

関連する問題