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了

  • 相关阅读:
    WEB安全 php+mysql5注入防御(一)
    Spring 整合 Quartz 实现动态定时任务(附demo)
    dubbo工作原理(3)
    dubbo服务降级(2)
    dubbo服务降级(1)
    程序员决对不能缺少产品思维
    GNUPG
    idea远程debug:tomcat
    基于JavaMail的Java邮件发送:复杂邮件发送
    使用javaMail发送简单邮件
  • 原文地址:https://www.cnblogs.com/ywhyme/p/10660411.html
Copyright © 2011-2022 走看看