यहाँ सरल है कोड है, जो python3 coroutine का उपयोग करता है और काम ठीक से रोकने के SIGING और SIGTERM संकेतों के लिए हैंडलर सेट के साथ:python3 asyncio "टास्क नष्ट हो गया था, लेकिन यह लंबित है" कुछ विशिष्ट हालत
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import asyncio
import signal
import sys
def my_handler(signum, frame):
print('Stopping')
asyncio.get_event_loop().stop()
# Do some staff
sys.exit()
@asyncio.coroutine
def prob_ip(ip_addr):
print('Ping ip:%s' % ip_addr)
proc = yield from asyncio.create_subprocess_exec('ping', '-c', '3', ip_addr)
ret_code = yield from proc.wait()
if ret_code != 0:
print("ip:%s doesn't responding" % ip_addr)
# Do some staff
yield from asyncio.sleep(2)
# Do more staff
yield from asyncio.sleep(16)
@asyncio.coroutine
def run_probing():
print('Start probing')
# Do some staff
yield from asyncio.sleep(1)
while True:
yield from asyncio.wait([prob_ip('192.168.1.3'), prob_ip('192.168.1.2')])
yield from asyncio.sleep(60)
def main():
parser = argparse.ArgumentParser()
parser.description = "Probing ip."
parser.parse_args()
signal.signal(signal.SIGINT, my_handler)
signal.signal(signal.SIGTERM, my_handler)
asyncio.get_event_loop().run_until_complete(run_probing())
if __name__ == '__main__':
main()
जब मैं चलाने इसके माध्यम से:
python3 test1.py
यह बिना किसी चेतावनी के Ctrl-C द्वारा रोकता है। लेकिन जब मैंने उसे के माध्यम से चलाएँ:
python3 -m test1
यह Ctrl-C द्वारा चेतावनी प्रिंट:
from setuptools import setup
setup(name='some_scripts',
version='1.0.0.0',
author='Some Team',
author_email='[email protected]',
url='https://www.todo.ru',
description='Some scripts',
packages=['my_package'],
entry_points={'console_scripts': [
'test1=my_package.test1:main',
]},
)
मेरे अजगर:
$ python3 -m test1
Start probing
Ping ip:192.168.1.2
Ping ip:192.168.1.3
PING 192.168.1.2 (192.168.1.2): 56 data bytes
PING 192.168.1.3 (192.168.1.3): 56 data bytes
^C--- 192.168.1.2 ping statistics ---
--- 192.168.1.3 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
1 packets transmitted, 0 packets received, 100% packet loss
Stopping
Task was destroyed but it is pending!
task: <Task pending coro=<prob_ip() running at /tmp/test1.py:22> wait_for=<Future pending cb=[Task._wakeup()]> cb=[_wait.<locals>._on_completion() at /usr/lib/python3.4/asyncio/tasks.py:394]>
Task was destroyed but it is pending!
task: <Task pending coro=<prob_ip() running at /tmp/test1.py:22> wait_for=<Future pending cb=[Task._wakeup()]> cb=[_wait.<locals>._on_completion() at /usr/lib/python3.4/asyncio/tasks.py:394]>
ही चेतावनी मैं अगर मैं इस स्क्रिप्ट के माध्यम से स्थापित संस्करण "3.4.2"
आप [loop.add_signal_handler] (https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.BaseEventLoop.add_signal_handler) का उपयोग करना चाह सकते हैं, हालांकि यह आपकी समस्या से संबंधित नहीं है। – Vincent
हां, धन्यवाद, इस तरह मेरे मामले में बेहतर दिखता है। लेकिन यह मदद नहीं करता है। मुझे अभी भी वही चेतावनियां मिलती हैं। – willir