我已经创建了一个proxychecker,当它单独检查所有代理时,它可以很好地运行。但我想实现功能,这样在键盘中断时,它就会取消所有挂起的proxychecking协同器,并优雅地退出。在当前状态下,在键盘中断时,程序不会优雅地退出,我会收到错误消息--“任务已被销毁,但它正在挂起!”
在做了一些研究之后,我意识到这正在发生,因为我正在关闭事件循环,在协同器已经完成取消之前。我决定尝试并尝试实现在这个堆栈溢出帖子中找到的解决方案:What's the correct way to clean up after an interrupted event loop?。
但是,我的实现不起作用;执行似乎被卡在loop.run_forever()中,因为在键盘中断时,我的终端被卡在处理过程中。
如果可能的话,我真的希望有一个解决方案,不需要等待待定的任务完成。目标功能是在键盘中断时,程序删除所有内容,发出报告并退出。
此外,我是新手异步,所以任何建设性的批评,我如何构建我的程序,也是真正的赞赏。
async def check_proxy(self, id, session):
proxy = self.plist[0]
del self.plist[0]
try:
self.stats["tries"] += 1
async with session.head(self.test_url, proxy=proxy, timeout=self.timeout) as response:
if response and response.status == 200:
self.stats["alive"] += 1
self.alive.append(proxy)
print(f"{id} has found a live proxy : " + proxy)
except Exception:
pass
async def main(self):
tasks = []
connector = ProxyConnector()
async with aiohttp.ClientSession(connector=connector, request_class=ProxyClientRequest) as session:
while len(self.plist) > 0:
if len(self.plist) >= self.threads:
for i in range(self.threads):
tasks.append(asyncio.ensure_future(self.check_proxy(i+1, session)))
else:
for i in range(len(self.plist)):
tasks.append(asyncio.ensure_future(self.check_proxy(i+1, session)))
await asyncio.gather(*tasks)
def start(self):
self.load_proxies()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(self.main())
except KeyboardInterrupt:
for task in asyncio.Task.all_tasks():
task.cancel()
loop.run_forever()
asyncio.Task.all_tasks().exception()
finally:
loop.close()
self.report_stats()
理想情况下,输出应该如下所示:
..。
55找到了一个活动代理:socks5 5://81.10.222.118:1080
83找到了一个活动代理:socks5 5://173.245.239.223:16938
111找到了一个实时代理:socks5 5://138.68.41.90:1080
^C
尝试数: 160次
活着的: 32人
发布于 2019-08-20 18:05:23
我花了一段时间,因为我的分支在错误的轨道上,但这是解决办法,以防其他人遇到同样的问题。
except KeyboardInterrupt:
for task in asyncio.Task.all_tasks():
task.cancel()
loop.stop() #-- rather unintuitive in my opinion, works though.
loop.run_forever()
finally:
loop.close()
很简单的解决办法;不幸的是,我没有更快地意识到。希望这能防止其他人陷入类似的疯狂。干杯!
https://stackoverflow.com/questions/57538808
复制相似问题