首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >取消proxychecker中的协作/任务而不等待完成

取消proxychecker中的协作/任务而不等待完成
EN

Stack Overflow用户
提问于 2019-08-17 18:15:24
回答 1查看 91关注 0票数 0

我已经创建了一个proxychecker,当它单独检查所有代理时,它可以很好地运行。但我想实现功能,这样在键盘中断时,它就会取消所有挂起的proxychecking协同器,并优雅地退出。在当前状态下,在键盘中断时,程序不会优雅地退出,我会收到错误消息--“任务已被销毁,但它正在挂起!”

在做了一些研究之后,我意识到这正在发生,因为我正在关闭事件循环,在协同器已经完成取消之前。我决定尝试并尝试实现在这个堆栈溢出帖子中找到的解决方案:What's the correct way to clean up after an interrupted event loop?

但是,我的实现不起作用;执行似乎被卡在loop.run_forever()中,因为在键盘中断时,我的终端被卡在处理过程中。

如果可能的话,我真的希望有一个解决方案,不需要等待待定的任务完成。目标功能是在键盘中断时,程序删除所有内容,发出报告并退出。

此外,我是新手异步,所以任何建设性的批评,我如何构建我的程序,也是真正的赞赏。

代码语言:javascript
运行
复制
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人

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-20 18:05:23

我花了一段时间,因为我的分支在错误的轨道上,但这是解决办法,以防其他人遇到同样的问题。

代码语言:javascript
运行
复制
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()

很简单的解决办法;不幸的是,我没有更快地意识到。希望这能防止其他人陷入类似的疯狂。干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57538808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档