python之线程池

#!/user/bin/evn python
# -*- coding:utf-8 -*-

import threading
import queue,time

‘‘‘
线程池的思路:
将任务依次放在队列里面
然后从队列取出任务交给线程执行
‘‘‘
stopEvent=object()#任务完了的标志---下面我们将任务包封装到元组中
class ThreadPool(object):
    def __init__(self,max_num):
        #创建队列
        self.q=queue.Queue()
        #创建线程最大的数量(线程池的最大容量)
        self.max_num=max_num
        #空闲线程列表(数量)
        self.free_list=[]
        #真实创建的线程列表(数量)
        self.gemerate_list=[]
        #中断任务标志
        self.terminal=False

        self.num=0
    def run(self,func,args,callback=None):

        #func:任务函数
        #args:任务函数的参数
        #callback:线程执行成功或者失败后执行的回调函数
        task=(func,args,callback)#将任务封装到元组中 ==任务包
        #将任务包放到队列中
        self.q.put(task)
        #创建线程
        if len(self.free_list)==0 and len(self.gemerate_list)<self.max_num :
            self.generate_thread()

    #创建线程
    def generate_thread(self):
        #创建一个线程
        t=threading.Thread(target=self.call)
        t.start()

    def call(self):
        ‘‘‘
        循环去获取任务函数并执行任务函数
        ‘‘‘
        #获取当前线程
        current_thread=threading.currentThread
        #将当前线程添加到列表中
        self.gemerate_list.append(current_thread)

        #获取任务
        Event=self.q.get()

        while Event!=stopEvent :#表示是任务
            #分解任务包
            func,args,callable=Event
            status=True #标志执行成功
            try:
                 #执行任务
                ret=func(*args)
            except Exception as e:
                status=False
                ret=e
            #执行回调函数callback
            if callback==None:
                pass
            else:
                callback(status,ret)

            if self.terminal :#不终止任务
                Event=stopEvent
            else:
                #标记:我空闲了
                self.free_list.append(current_thread)
                #再从队列去取任务
                Event=self.q.get()
                #将线程从空闲列表中移除
                self.free_list.remove(current_thread)

        else:#表示不是任务
            self.gemerate_list.remove(current_thread)

    #任务执行完毕后 停止运行
    def close(self):
         time.sleep(2)
         num=len(self.gemerate_list)
         print(num)
         while num:
             self.q.put(stopEvent)#往队列添加停止标志(创建了多少线程,就添加多少)
             num-=1

    def terminals(self):
        self.terminal=True#标记任务终止
        while self.gemerate_list:
            self.q.put(stopEvent)
        self.q.empty()#清空队列

#回调函数
def callback(statue,result):
    # print(statue)
    # print(result)
    pass

#任务函数
def action(args):
    time.sleep(1)
    print(args)
    return args

#创建线程池对象
pool=ThreadPool(10)
for item in range(100):
    ‘‘‘
    #将任务放在队列中
    #着手开始处理任务(线程处理)
        --创建线程
              有空闲线程,则不再创建线程
              没有空闲线程,开始创建线程
                    1.不能高于线程池的限制
                    2.根据任务来判断
        --去队列取任务
    ‘‘‘
    pool.run(func=action,args=(item,),callback=callback)
# pool.close()#任务执行完后
#pool.terminals()终止任务
时间: 2024-10-06 08:43:45

python之线程池的相关文章

python自定义线程池

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #!/usr/bin/env python 4 # -*- coding:utf-8 -*- 5 6 import queue 7 import threading 8 import contextlib 9 import time 10 11 StopEvent = object() 12 13 14 class ThreadPool(object): 15 16 def __init__(s

Python之路【第八篇】python实现线程池

线程池概念 什么是线程池?诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务.但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大.所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了“池”的概念,“池”的概念使得人们可以定制一定量的资源,然后对这些资源

python实现线程池

什么是线程池?     诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务.但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大.所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了"池"的概念,"池"的概念使得人们可以定制

《Python》线程池、携程

一.线程池(concurrent.futures模块) #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异步调用 Both implement the same interface, which is defined by the abstract Executor class. #2 基本方法 #submit(fn, *args, **kwargs

Python的线程池

#!/usr/bin/env python # -*- coding: utf-8 -*- """ concurrent 用于线程池和进程池编程而且更加容易,在Python3.2中才有. """ import sys from concurrent.futures import ThreadPoolExecutor, as_completed, wait from multiprocessing import Manager Manager().

[python] ThreadPoolExecutor线程池 python 线程池

初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程,而同时只允许3个线程在运行,但是20个线程都需要创建和销毁,线程的创建是需要消耗系统资源的,有没有更好的方案呢?其实只需要三个线程就行了,每个线程各分配一个任务,剩下的任务排队等待,当某个线程完成了任务的时候,排队任务就可以安排给这个线程继续执行. 这就是线程池的思想(当然没这么简单),但是自己编

Python菜鸟之路:Python基础-线程池注释

import sys import threading import Queue import traceback # 定义一些Exception,用于自定义异常处理 class NoResultsPending(Exception): """All works requests have been processed""" pass class NoWorkersAvailable(Exception): """N

python 之 线程池实现并发

使用线程池实现高IO并发 模块:ThreadPoolExecutor, as_completed 测试代码如下: #!/opt/python3/bin/python3 from concurrent.futures import ThreadPoolExecutor, as_completed import time def test(arg1, arg2, arg3): time.sleep(int(arg1)) print('参数1:%s 参数2:%s 参数3:%s' % (arg1,arg

Python&mdash;MySQL线程池

python实现版本: #!/usr/python/bin/python3 # -*- coding:utf-8 -*- ############################ #File Name: mysql_threading_pool.py #Author: ykyk #Mail: [email protected] #Created Time: 2019-01-10 09:17:32 ############################ import logging import