asyncio 自动跳出长时间堵塞的 task
https://www.cnblogs.com/ywhyme/p/10660411.html 的升级版
可以知道当前是卡在哪一个 task 甚至是多少行
import asyncio
import os
import queue
import signal
import time
import threading
import logging
# logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(filename)s : %(levelname)s %(message)s", )
logging.basicConfig(level=logging.DEBUG)
# 魔改部分
# 魔改原因, 在 loop.debug 为 True 的时候才会给 loop 设置 _current_handle
from asyncio import events
class Handle(events.Handle):
def _run(self):
self._loop._current_handle = self
super()._run()
events.Handle = Handle
# 魔改结束
async def factorial(name, number):
f = 1
for i in range(2, number + 1):
print(f"Task {name}: Compute factorial({i})...")
await asyncio.sleep(1)
f *= i
print(f"Task {name}: factorial({number}) = {f}")
async def test():
for i in range(100):
print("sleep--", i)
time.sleep(1)
def handler(signum, frame):
print('Signal handler called with signal', signum)
raise Exception("Kill the task")
signal.signal(signal.SIGTERM, handler)
async def main():
await asyncio.gather(
test(),
factorial("A", 2),
factorial("B", 3),
factorial("C", 4),
return_exceptions=True
)
def check(co_name, threshold: int = 60) -> bool:
"""连续的记录超过阈值"""
i = 0
for item in q:
if item == co_name:
i += 1
else:
break
if i >= threshold:
return True
else:
return False
def asyncio_monitor(loop, step: int = 1):
while not stop:
if hasattr(loop._current_handle, "_callback"):
callback = loop._current_handle._callback
task = getattr(callback, "__self__") # Task
co_name = task._coro.cr_code.co_name # task._coro.cr_code.co_name # coro name
if check(co_name, 10):
# 长时间堵塞, 抛出异常让 task 结束
if pid != None:
os.system(f"kill -{signal.SIGTERM} {pid}")
if task._state == "PENDING":
q.appendleft(co_name)
# info 为一个的回显字符串
info = str(getattr(callback, "__self__", callback))
print(info)
#
# coro = task._coro.co_name # coro name
# task._state # futures/_base.py:25
#
time.sleep(step)
def run_asyncio(loop):
global stop
# loop.set_debug(True)
loop.run_until_complete(main())
stop = True
if __name__ == '__main__':
pid = os.getpid()
print(pid)
stop = False
q = queue.deque(maxlen=100)
loop = asyncio.get_event_loop()
t1 = threading.Thread(target=asyncio_monitor, args=(loop,))
t1.start()
run_asyncio(loop)
asyncio 自动跳出长时间堵塞的 task的更多相关文章
- 在asyncio 中跳出正在执行的task
需求描述 代码在asyncio的框架中运行, 但是一旦一个task出现了长时间的堵塞,我们要跳过这个task(代码可能是用户输入的,例如用户编写的插件) 代码如下 (其中大部分代码出自官方的 asyn ...
- WPF窗口长时间无人操作鼠标自动隐藏
在软件开发中有时会有等待一段时间无人操作后隐藏鼠标,可能原因大致如下: 1.为了安全性,特别是那些需要用到用户名和密码登录服务端的程序,常常考虑长期无人操作,程序自动跳转到用户登录界面: 2.软件为了 ...
- JavaScript长时间未操作自动退出登录
主要是通过mouseover 来监听有没有进行当前页面操作,通过未操作时间和设定退出的时间做比较,从而退出登录. var oldTime = new Date().getTime(); var new ...
- web页面长时间未操作自动退出登录
var lastTime = new Date().getTime(); var currentTime = new Date().getTime(); * * ; //设置超时时间: 10分 $(f ...
- jdbc 数据库连接 长时间空闲 断开连接 ApplicationContext.xml
数据库连接 长时间空闲 断开连接solution: <property name="validationQuery" value="select 1"/& ...
- wireshark长时间抓包分多个文件
前言 说一说这个问题的由来,一般使用wireshark不需要长时间抓包的,但是有时候遇到网络通信中非常棘手的问题,例如一个小时出现一次或者几个小时出现一次问题的情况,这种情况下就必须长时间抓包了.但是 ...
- ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)
转自:http://sis hu ok.com/forum/blogCategory/showByCategory.html?categories_id=138&user_id=10385 ...
- 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)
分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App ...
- WinForm触摸屏程序功能界面长时间不操作自动关闭回到主界面 z
操作者经常会在执行了某操作后,没有返还主界面就结束了操作然后离开了,程序应该关闭功能窗体自动回到主界面方便下一位操作者操作.那么对于WinForm程序怎么实现呢? 实现原理:拦截Application ...
随机推荐
- HDU4572 Bottles Arrangement
/* HDU4572 Bottles Arrangement http://acm.hdu.edu.cn/showproblem.php?pid=4572 数论 找规律 题意:有m行n列和1-n的数各 ...
- Android 5.0 怎样正确启用isLoggable(二)__原理分析
前置文章 <Android 5.0 怎样正确启用isLoggable(一)__使用具体解释> 概要 在上文<Android 5.0 怎样正确启用isLoggable(一)__使用具体 ...
- iOS不同版本号适配问题(#ifdef __IPHONE_7_0)
部分參考http://www.cnblogs.com/ios8/p/ios-version-com.html 以下举个简单的样例来说明在iOS7.0和iOS6.1(以及更低版本号)之间的适配问题(用的 ...
- hdu4762Cut the Cake(概率+大数操作(java)+C++高精度模板)
题目链接:点击打开链接 题目描写叙述:现有一个大蛋糕.上面随机分布了n个草莓,然后将草莓切成m块,问n个草莓全在一块蛋糕上面的概率? 解题思路:细致分析可得:C(n,1)/m^(n-1) 因为m< ...
- HDU 2255 奔小康赚大钱 KM算法题解
KM算法求的是完备匹配下的最大权匹配,是Hungary算法的进一步,由于Hungary算法是最大匹配的算法,不带权. 经典算法,想不出来的了,要參考别人的.然后消化吸收吧. 由于真的非常复杂的算法. ...
- atitit.浏览器插件解决方式----ftp插件 attilax 总结
atitit.浏览器插件解决方式----ftp插件 attilax 总结 1. 界面概览 D:云盘同步目录p5p5f tp.demo.html1 2. 初始化1 3. 事实调用2 4. 參考2 1 ...
- Codeforces Beta Round #95 (Div. 2) D. Subway 边双联通+spfa
D. Subway A subway scheme, classic for all Berland cities is represented by a set of n stations co ...
- luogu1072 Hankson的趣味题
题目大意 给出数a0, a1, b0, b1,求满足gcd(a0, x)=a1, lcm(b0, x)=b1的x的个数 解法一 枚举b1的因数,看看是否满足上述条件. 怎样枚举因数 试除法.对于1~s ...
- B1567 [JSOI2008]Blue Mary的战役地图 二分答案+hash
一开始以为是dp,后来看了一下标签...二分答案?之前也想过,但是没往下想,然后之后的算法就顺理成章,先求出第一个地图的所有子矩阵的hash值,然后求第二个,在上一个地图例二分查找,然后就没了. 算法 ...
- ROS-launch文件标签解读
前言:ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系 ...