zoukankan      html  css  js  c++  java
  • 在asyncio 中跳出正在执行的task

    需求描述

    代码在asyncio的框架中运行, 但是一旦一个task出现了长时间的堵塞,我们要跳过这个task(代码可能是用户输入的,例如用户编写的插件)

    代码如下

    (其中大部分代码出自官方的 asyncio 以及 signal)
    重点的函数在于 asyncio.gather 详情查看上面的链接

    import asyncio
    import os
    import signal
    import time
    
    
    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 OSError("Couldn't open device!")
    
    
    signal.signal(signal.SIGTERM, handler)
    
    print(os.getpid())
    
    
    async def main():
        # Schedule three calls *concurrently*:
        await asyncio.gather(
            test(),
            factorial("A", 2),
            factorial("B", 3),
            factorial("C", 4),
            return_exceptions=True
        )
    
    
    asyncio.run(main())
    

    运行结果如下

    18733
    sleep-- 0
    sleep-- 1
    sleep-- 2
    sleep-- 3
    sleep-- 4
    sleep-- 5
    sleep-- 6
    Signal handler called with signal 15
    Task A: Compute factorial(2)...
    Task B: Compute factorial(2)...
    Task C: Compute factorial(2)...
    Task A: factorial(2) = 2
    Task B: Compute factorial(3)...
    Task C: Compute factorial(3)...
    Task B: factorial(3) = 6
    Task C: Compute factorial(4)...
    Task C: factorial(4) = 24
    
    Process finished with exit code 0
    

    这样就可以跳过被长时间堵塞的task,或者长时间执行的task了

  • 相关阅读:
    C++输入与输出
    数组与指针
    MFC+WinPcap编写一个嗅探器之零(目录)
    netty源码分析之揭开reactor线程的面纱(二)
    netty源码分析之揭开reactor线程的面纱(一)
    Vert.x 线程模型揭秘
    理解 RxJava 的线程模型
    Java RESTful 框架的性能比较
    Java借助CountDownLatch完成异步回调
    在 Java 中运用动态挂载实现 Bug 的热修复
  • 原文地址:https://www.cnblogs.com/twotigers/p/10660411.html
Copyright © 2011-2022 走看看