基于队列queue实现的线程池
本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅!
写在前文:在Python中给多进程提供了进程池类,对于线程,Python2并没有直接提供线程池类(Python3中提供了线程池功能),而线程池在并行中应用较广泛,因此实现一个进程池的功能十分必要。本文基于队列(queue)功能来实现线程池功能。
在Python3标准库中提供了线程池、进程池功能,推荐使用标准库。
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor
实现代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__auth__ = "SongWei"
import threading,queue,time class Threadpool:
'''基于队列queue实现的线程池''' def __init__(self,max_thread=1):
'''创建进程队列'''
self.queue = queue.Queue(maxsize=max_thread) def apply(self,target=None,args=(),callback=None,calljoin=True,**kwargs):
''':param callback 回调函数 当子线程函数运行结束后将返回值传入回调函数
:param calljoin 布尔值 回调函数是否阻塞进程池 默认True 只有当目标函数和回调函数都执行结束后才视为该线程结束
其他参数同threading.Thread类
注意:只有当目标函数和回调函数都执行结束后,消息队列才会取回值(即回调函数会阻塞线程池)
'''
if not callback:
callback = self._callback
t = threading.Thread(target=self._decorate(target,callback,calljoin),args=args,**kwargs)
self.queue.put(t)
t.start() def join(self):
'''
当线程池中还有未执行结束的子线程时 阻塞主线程
注意:当calljoin=False时 因回调函数在消息队列取回后才执行 故join不会等待回调函数
'''
while self.queue.qsize():
time.sleep(0.05) def _decorate(self,target,callback,calljoin):
''':param target 接收一个目标函数
:param callback 接受一个回调函数
:param backjoin 布尔值 若为真 则当回调函数执行结束后才释放队列 否则 当目标函数执行结束后就会释放队列
本函数本质上是一个装饰器,即运行目标函数后,执行队列取回(self.queque.get()),并将返回值作为参数执行回调函数。
'''
def wrapper(*args,**kwargs):
res = target(*args,**kwargs)
if calljoin:
callback(res)
self.queue.get()
else:
self.queue.get()
callback(res)
return res
return wrapper def _callback(self,*args,**kwargs):
'''没有传入回调函数时 什么也不干'''
pass 调用示例:
result_list = []
def func(arg):
print('正在等待执行%s' % arg)
time.sleep(10)
return arg def back(res):
print('我已经取回了数据:%s' % res)
result_list.append(res) pool = Threadpool(max_thread=20)
for i in range(40):
pool.apply(target=func,args=(i,),callback=back)
pool.join()
print(result_list)
基于队列queue实现的线程池的更多相关文章
- 基于C++11实现的线程池
1.C++11中引入了lambada表达式,很好的支持异步编程 2.C++11中引入了std::thread,可以很方便的构建线程,更方便的可移植特性 3.C++11中引入了std::mutex,可以 ...
- 一个C++基于boost简单实现的线程池
xl_blocking_queue.h ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- 线程池 队列 synchronized
线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...
- python全栈开发 * 线程队列 线程池 协程 * 180731
一.线程队列 队列:1.Queue 先进先出 自带锁 数据安全 from queue import Queue from multiprocessing import Queue (IPC队列)2.L ...
- 【Java并发】并发队列与线程池
并发队列 阻塞队列与非阻塞队 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBl ...
- java多线程:线程池原理、阻塞队列
一.线程池定义和使用 jdk 1.5 之后就引入了线程池. 1.1 定义 从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需 ...
- Python并发编程之消息队列补充及如何创建线程池(六)
大家好,并发编程 进入第六篇. 在第四章,讲消息通信时,我们学到了Queue消息队列的一些基本使用.昨天我在准备如何创建线程池这一章节的时候,发现对Queue消息队列的讲解有一些遗漏的知识点,而这些知 ...
- Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...
- Callable,阻塞队列,线程池问题
一.说说Java创建多线程的方法 1. 通过继承Thread类实现run方法 2. 通过实现Runnable接口 3. 通过实现Callable接口 4. 通过线程池获取 二. 可以写一个Call ...
随机推荐
- table 表格 细边框 最简单样式
table 表格细边框的效果实现方法虽然不难,但网上简单有效的方法却很少,在此记录一下 css 样式 /** table 细边框 **/ table{border-collapse: collapse ...
- Power Designer导出模型的sql加注释-Oracle语句
第一步:Database-->Edit Current DBMS 第二步: 然后分别将 Script-->Objects-->Table-->TableComment Scri ...
- C#连接Oracle数据库字符串(引入DLL)
需求:从一台Oracle数据库获取数据,本以为是很简单的事情,直接将原来的SqlClient换成OracleClient调用,结果远没自己想的简单.要么安装Oracle客户端,要么安装PLSQL.网上 ...
- 原生JavaScript(js)手把手教你写轮播图插件(banner)
---恢复内容开始--- 1.轮播图插件 1.什么是插件: 为已有的程序增加功能 2.插件的特点(为什么要做成一个插件)与注意事项: 1.通用性,可移植性强 2.兼容性:不会对其他代码产生影响 3.创 ...
- echarts legend 限制规定显示个数,显示省略号,修改默认样式
类似百度统计,有的时候legend的个数比较多,但是前端需要控制初始化显示的个数,以及最多显示的条数,先看效果图: 先给代码: <!DOCTYPE html> <html lang= ...
- JS闪电打字特效
HTML <div class="page page-thunder-to-text"> <input id="input" type=&qu ...
- C# 发送邮件 并自定义邮件格式
话不多说,直接上代码 //邮件提醒 string Body = @"Dear " + list.Rows[i]["people"] + ":<b ...
- SpringBoot中Shiro缓存使用Redis、Ehcache
在SpringBoot中Shiro缓存使用Redis.Ehcache实现的两种方式实例 SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这sh ...
- lumen 路由访问路径
项目目录/public/index.php/接你设置的路由 比如设置了 $app->get('/test', function () use ($app) { return $app-&g ...
- 深度搜索(dfs)+典型例题(八皇后)
深度优先搜索简称深搜,从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”. 如上面的图所示:加入我们要找一个从V0到 ...