需求描述

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

代码如下

(其中大部分代码出自官方的 asyncio 以及 signal)

重点的函数在于 asyncio.gather 详情查看上面的链接

  1. import asyncio
  2. import os
  3. import signal
  4. import time
  5. async def factorial(name, number):
  6. f = 1
  7. for i in range(2, number + 1):
  8. print(f"Task {name}: Compute factorial({i})...")
  9. await asyncio.sleep(1)
  10. f *= i
  11. print(f"Task {name}: factorial({number}) = {f}")
  12. async def test():
  13. for i in range(100):
  14. print("sleep--", i)
  15. time.sleep(1)
  16. def handler(signum, frame):
  17. print('Signal handler called with signal', signum)
  18. raise OSError("Couldn't open device!")
  19. signal.signal(signal.SIGTERM, handler)
  20. print(os.getpid())
  21. async def main():
  22. # Schedule three calls *concurrently*:
  23. await asyncio.gather(
  24. test(),
  25. factorial("A", 2),
  26. factorial("B", 3),
  27. factorial("C", 4),
  28. return_exceptions=True
  29. )
  30. asyncio.run(main())

运行结果如下

  1. 18733
  2. sleep-- 0
  3. sleep-- 1
  4. sleep-- 2
  5. sleep-- 3
  6. sleep-- 4
  7. sleep-- 5
  8. sleep-- 6
  9. Signal handler called with signal 15
  10. Task A: Compute factorial(2)...
  11. Task B: Compute factorial(2)...
  12. Task C: Compute factorial(2)...
  13. Task A: factorial(2) = 2
  14. Task B: Compute factorial(3)...
  15. Task C: Compute factorial(3)...
  16. Task B: factorial(3) = 6
  17. Task C: Compute factorial(4)...
  18. Task C: factorial(4) = 24
  19. Process finished with exit code 0

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

在asyncio 中跳出正在执行的task的更多相关文章

  1. 从零开始学asyncio(中)

    本篇文章主要是讲解asyncio模块的实现原理. 这个系列还有另外两篇文章: 从零开始学asyncio(上) 从零开始学asyncio(下) 一. asyncio模块简介 asyncio是python ...

  2. 细说.NET中的多线程 (三 使用Task)

    上一节我们介绍了线程池相关的概念以及用法.我们可以发现ThreadPool. QueueUserWorkItem是一种起了线程之后就不管了的做法.但是实际应用过程,我们往往会有更多的需求,比如如果更简 ...

  3. storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解

    本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...

  4. Asyncio中Lock部分的翻译

    Asyncio中Lock部分的翻译 Locks class asyncio.Lock(*, loop=None) 原始锁的对象. 这个基础的锁是一个同步化的组件,当它上锁的时候就不属于典型的协程了(译 ...

  5. storm中worker、executor、task之间的关系

    这里做一些补充: worker是一个进程,由supervisor启动,并只负责处理一个topology,所以不会同时处理多个topology. executor是一个线程,由worker启动,是运行t ...

  6. .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况

    一个简单的 Task 不会消耗多少时间,但如果你不合适地将 Task 转为同步等待,那么也可能很快耗尽线程池的所有资源,出现类似死锁的情况. 本文将以一个最简单的例子说明如何出现以及避免这样的问题. ...

  7. Unity中脚本的执行顺序总结(@WhiteTaken)

    (Editor)以上是Unity官方文档中的截图,脚本在被挂载到物体上,会启用Editor的方法Reset. (Initialization)当执行脚本开始,初始化的过程中,依次执行的是Awake-& ...

  8. 代码在ie9中不能正确执行

    <!DOCTYPE html> <html> <head lang="zh"> <meta charset="UTF-8&quo ...

  9. html5 webDatabase 存储中sql语句执行可嵌套使用

    html5 webDatabase 存储中sql语句执行可嵌套使用,代码如下: *); data.transaction(function(tx){ tx.executeSql("creat ...

随机推荐

  1. hdu 2121无根最小树形图要建一个虚拟节点

    #include<stdio.h> #include<string.h> #define inf 999999999 #define N 1100 struct node { ...

  2. 使用 Redis及其产品定位

    实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: ...

  3. codechef Little Elephant and Bombs题解

    The Little Elephant from the Zoo of Lviv currently is on the military mission. There are N enemy bui ...

  4. hadoop权威指南(第四版)要点翻译(5)——Chapter 3. The HDFS(5)

    5) The Java Interface a) Reading Data from a Hadoop URL. 使用hadoop URL来读取数据 b) Although we focus main ...

  5. const指针总结

    const 总结: 假设keywordconst出如今星号左边.表示被指物是常量:即不能通过指针改动变量的值. 假设keywordconst出如今星号右边,表示指针自身是常量:即不能改变指针的指向. ...

  6. NSAttributedString宽高计算小技巧

    通常对于CoreText之类自己实现绘制的控件来说,计算富文本的宽高事实上须要依赖CTFramesetterSuggestFrameSizeWithConstraints这种方法. 但有些时候.我们可 ...

  7. 约瑟夫环问题的链表解法和数学解法(PHP)

    约瑟夫环问题 一群猴子排成一圈.按1,2,-,n依次编号.然后从第1仅仅開始数,数到第m仅仅,把它踢出圈.从它后面再開始数,再数到第m仅仅.在把它踢出去-.如此不停的进行下去.直到最后仅仅剩下一仅仅猴 ...

  8. spring属性的三种注入方法

    (1)使用set方法: public class Book {  private String bookname;public void setBookname(String bookname) {  ...

  9. 深度学习利器:TensorFlow在智能终端中的应用——智能边缘计算,云端生成模型给移动端下载,然后用该模型进行预测

    前言 深度学习在图像处理.语音识别.自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算.如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有 ...

  10. hdoj--2767--Proving Equivalences (scc+缩点)

    Proving Equivalences Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...