博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小白成长之路:初识python(六) --python线程池
阅读量:5327 次
发布时间:2019-06-14

本文共 2268 字,大约阅读时间需要 7 分钟。

#!/usr/bin/env python # -*- coding:utf-8 -*- import threading import queue import time """ 对照着武老师的课程自己跟着做了一个线程池,主要的思路就是把要执行的任务放进队列中 然后创建若干个线程不断地从队列中获取任务并执行 相对比low B 版的线程池有很大改进,姑且叫low A版吧。。。 """ Stop_Flag = object() class ThreadPool(object):     def __init__(self,max_num):         self.max_num = max_num         #创建一个队列用于保存任务         self.queue = queue.Queue()         #创建一个列表保存已经创建的线程         self.generate_list = []         #创建一个列表保存当前空闲的线程         self.free_list = []         #是否结束任务的标志         self.terminate_flag = False     def run(self, func, args, callback=None):         w = (func, args, callback,)         self.queue.put(w) #把相关的参数放入队列当中         if len(self.generate_list)< self.max_num and len(self.free_list) == 0:             self.generate()     def generate(self):         t = threading.Thread(target=self.call)         t.start()     def call(self):         ####获取当前的线程对象,并添加到已创建线程的列表当中         current_thread = threading.current_thread()         self.generate_list.append(current_thread)         work = self.queue.get()         #从队列中获取相关的任务信息         while work != Stop_Flag:             func, args, callback = work             try:                 ret = func(*args)             except Exception as e:                 print(e)             if callback:                 try:                     callback(ret)                 except Exception as ex:                     print(ex)             ###上面为一个线程执行一次任务的完整流程,一旦线程创建之后,则不断地从队列中获取任务             ######在执行完一次任务和获取下一次任务的空当内,线程处于空闲状态             if self.terminate_flag:                 break             else:                 self.free_list.append(current_thread)                 work = self.queue.get()                 self.free_list.append(current_thread)         ##在开始时或者在循环过程中接收到Stop_Flag时,都会执行下面的语句         self.generate_list.remove(current_thread)     def close(self):         #当只是完成上面的代码的情况下,主进程不会立即结束, ^ ^  因为这个时候并没有把Stop_Flag传入队列         for i in range(len(self.generate_list)):             self.queue.put(Stop_Flag)     def terminate(self):         self.terminate_flag = True def do(i):     # time.sleep(0.5)     print(i) def c():     pass pool = ThreadPool(10) for i in range(50):     pool.run(func=do, args=(i,)) pool.terminate() # pool.close()

转载于:https://www.cnblogs.com/zxxian/p/7800834.html

你可能感兴趣的文章
2018/6/19~2018/6/22 周记
查看>>
B. 存在的隐患
查看>>
Luogu P3172 [CQOI2015]选数
查看>>
spring 之 BeanFactory
查看>>
wordpress迁移服务器指南
查看>>
快速排序法
查看>>
C/C++中的预编译指令
查看>>
C# 标签的添加和删除(选择标签加样式)
查看>>
SpringMvc 大概流程分析
查看>>
JMeter记录篇5——JMeter体系结构
查看>>
读写(I/O)辩论
查看>>
Jmeter (一) 安装
查看>>
grep文本搜索工具详解
查看>>
2016031801 - 给移动硬盘分区
查看>>
Android Toast小解
查看>>
数据结构与算法问题 二叉排序树
查看>>
JAVA获取操作系统的信息
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
使用 Python 把多个 MP4 合成一个视频(转)
查看>>
php 递归无线级别分类
查看>>