类名不同,但公有方法的名字和提供的基本功能大致相同,但两个类没有共同继承的祖先或者抽象类 接口来规定他,叫鸭子类。

使并发核心池能够在 threadpoolexetor和geventpoolexecutor自由选一种切换。

实现方式。

# -*- coding: utf-8 -*-
# @Author : ydf
# @Time : 2019/7/2 14:11
import atexit
import time
import warnings
from collections import Callable import gevent
from gevent import pool as gevent_pool
from gevent import monkey from gevent.queue import JoinableQueue from app.utils_ydf import LoggerMixin, nb_print, LogManager def check_gevent_monkey_patch(raise_exc=True):
if not monkey.is_module_patched('socket'):
if raise_exc:
warnings.warn(f'检测到 你还没有打gevent包的猴子补丁,请在所运行的脚本第一行写上 【import gevent.monkey;gevent.monkey.patch_all()】 这句话。')
raise Exception(f'检测到 你还没有打gevent包的猴子补丁,请在所运行的脚本第一行写上 【import gevent.monkey;gevent.monkey.patch_all()】 这句话。')
else:
return 1 logger_gevent_timeout_deco = LogManager('logger_gevent_timeout_deco').get_logger_and_add_handlers() def gevent_timeout_deco(timeout_t):
def _gevent_timeout_deco(f):
def __gevent_timeout_deceo(*args, **kwargs):
timeout = gevent.Timeout(timeout_t, )
timeout.start()
try:
f(*args, **kwargs)
except gevent.Timeout as t:
logger_gevent_timeout_deco.error(f'函数 {f} 运行超过了 {timeout_t} 秒')
if t is not timeout:
nb_print(t)
# raise # not my timeout
finally:
timeout.close() return __gevent_timeout_deceo return _gevent_timeout_deco class GeventPoolExecutor(gevent_pool.Pool):
def __init__(self, size=None, ):
check_gevent_monkey_patch()
super().__init__(size, ) def submit(self, *args, **kwargs):
self.spawn(*args, **kwargs) def shutdown(self):
self.join() if __name__ == '__main__':
monkey.patch_all() def f2(x): time.sleep(1)
nb_print(x) pool = GeventPoolExecutor(4) for i in range(15):
nb_print(f'放入{i}')
pool.submit(gevent_timeout_deco(8)(f2), i)
nb_print(66666666)

对于收尾任务,threadpoolexecutor和这个还有少量不同,这个geventpool在脚本退出前不去主动join(shutdown)他,最后四个任务就会丢失 。

threadpoolexecutor起的是守护线程,按道理也会出现这样的结果,但是concurrent包里面做了atexit处理。这里也可以使用atexit.register注册shutdown达到同样的目的,不需要手动调用join防止脚本提前退出。

实现eventlet的核心池,同理。

最新文章

  1. 多个mysql解决方法
  2. JAVA6开发WebService (一)
  3. 恶意IP远程登录Linux服务器脚本
  4. [C#] 委托之Action和Func区别
  5. MySQLdb模块 类操作方法
  6. 深入理解JVM-3垃圾收集器与内存分配策略
  7. DB设计原则(一)字段名定义避免二义性。
  8. mysql 共享锁-排它锁
  9. 定义文件XML——从简单开始
  10. CentOS7安装GUI图形界面
  11. 20190320_head first pyhton学习笔记之构建发布
  12. JS浮点计算精度问题分析与解决
  13. Pandas.Series.dt.dayofweek相关命令
  14. HihoCoder - 1078 【区间修改】
  15. idea查看jar包是否存在
  16. [十二省联考2019]异或粽子 (可持久化01tire 堆)
  17. VS2010 的 HTML 5验证
  18. CSS条件注释
  19. Android开发FAQ集锦!!!
  20. vue-cli构建的vue项目中引入stylus文件

热门文章

  1. MySQL 自带的4个系统数据库的说明
  2. Docker版zabbix
  3. zabbix--邮件告警报错“Support for SMTP authentication was not compiled in”
  4. Vue开发之项目创建
  5. PHP、asp、aspx、JSP一句话
  6. JVM垃圾回收器理论分析与详解【纯理论】
  7. selenium安装
  8. Spring Boot 缓存 知识点
  9. 接口自动化测试框架【windows版】:jmeter + ant + jenkins
  10. js定时器关闭,js定时器停止,一次关闭所有正在运行的定时器,自定义函数clearIntervals()一次关闭所有正在运行的定时器