Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用asyncio清除和改进此python代码?_Python_Python 3.x_Python Asyncio - Fatal编程技术网

如何使用asyncio清除和改进此python代码?

如何使用asyncio清除和改进此python代码?,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我正在编写一个python脚本来监视多个站点的状态。 由于它应该以精确的间隔检查网站状态,而不会被其他网站检查阻止,因此我使用的是asyncio。 但当我捕捉到信号时,我似乎没有正确地停止,或者可能是我做的每件事都错了 /usr/lib/python3.5/asyncio/unix_events.py:129: RuntimeWarning: coroutine 'exit_sigint' was never awaited del self._signal_handlers[sig] ex

我正在编写一个python脚本来监视多个站点的状态。
由于它应该以精确的间隔检查网站状态,而不会被其他网站检查阻止,因此我使用的是asyncio。
但当我捕捉到信号时,我似乎没有正确地停止,或者可能是我做的每件事都错了

/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
/usr/lib/python3.5/asyncio/unix\u events.py:129:RuntimeWarning:coroutine'exit\u sigint'从未等待过
del self.\u信号处理程序[sig]
调用的回调时发生异常
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3.5/concurrent/futures/_base.py”,第297行,在调用调用中
回拨(自我)
文件“/usr/lib/python3.5/asyncio/futures.py”,第442行,处于调用设置状态
dest\u loop.call\u soon\u threadsafe(\u set\u state,destination,source)
文件“/usr/lib/python3.5/asyncio/base\u events.py”,第532行,在call\u soon\u threadsafe中
handle=self.\u尽快调用(回调,args)
文件“/usr/lib/python3.5/asyncio/base\u events.py”,第506行,即将调用
自我检查关闭()
文件“/usr/lib/python3.5/asyncio/base\u events.py”,第334行,in\u check\u closed
raise RUNTIMERROR('事件循环已关闭')
RuntimeError:事件循环已关闭
源代码:

我应该改变什么,我正确地做了什么?

根据:

确保未来
计划协同程序对象的执行:在未来将其包装。返回一个任务对象

您的回调运行一个应该由您的循环管理的协同程序,但是您永远不会在它完成之前运行它,所以您永远不会等待它完成。事实上,通过这样包装回调,您不能调用
run\u,直到它完成

无论如何,回调不必是异步的,所以您可以这样使用它们:

#exit#sigint甚至不需要循环作为参数
def出口信号(信号名称):
打印(“%s已捕获,正在退出…”%signame)
对于asyncio.task.all_tasks()中的任务:
task.cancel()
loop.add_signal_handler(getattr(signal,“SIGINT”),exit_SIGINT,“SIGINT”)
loop.add\u signal\u处理程序(getattr(signal,“SIGTERM”),exit\u sigint,“SIGTERM”)
没有把它们包装成未来