博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之路:线程池
阅读量:5067 次
发布时间:2019-06-12

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

版本一

#
!/usr/bin/env  python
#
 --*--coding:utf-8 --*--
import Queue
import threading
class ThreadPool(object):
#
创建类
    
def 
__init__(self, max_num=20):
#
进程函数,默认最大20个进程
        self.queue = Queue.Queue(max_num)
#
生成进程
        
for i 
in xrange(max_num):
#
循环进程
            self.queue.put(threading.Thread)
#
上传进程
    
def get_thread(self):
#
下载进程函数
        
return self.queue.get()
    
def add_thread(self):
#
生成进程函数
        self.queue.put(threading.Thread)
pool = ThreadPool(10)
#
执行类,并传默认进程数值
def func(arg, p):
#
打印进程
    
print arg
    
import time
    time.sleep(2)
#
间隔2秒
    p.add_thread()
for i 
in xrange(30):
#
循环进程
    thread = pool.get_thread()
    t = thread(target=func, args=(i, pool))
#
传值到func函数,并且执行
    t.start()

 版本二

from Queue import Queue
import contextlib
import threading
 
WorkerStop = object()
 
 
class ThreadPool:
 
    workers = 0
 
    threadFactory = threading.Thread
    currentThread = staticmethod(threading.currentThread)
 
    def __init__(self, maxthreads=20, name=None):
 
        self.q = Queue(0)
        self.max = maxthreads
        self.name = name
        self.waiters = []
        self.working = []
 
    def start(self):
        while self.workers 
<
 min
(self.max, self.q.qsize()+len(self.working)):
            self.startAWorker()
 
    def startAWorker(self):
        self.workers +
= 1
        
name 
= "PoolThread-%s-%s"
 % (self.name or id(self), self.workers)
        newThread 
= self.threadFactory(target=self._worker, 
name
=name)
        
newThread.start()
 
    def callInThread(self, func, *args, **kw):
        self.callInThreadWithCallback(None, func, *args, **kw)
 
    def callInThreadWithCallback(self, onResult, func, *args, **kw):
        o 
= (func, 
args, kw, onResult)
        self.q.put(o)
 
 
    @contextlib.contextmanager
    def _workerState(self, stateList, workerThread):
        stateList.append(workerThread)
        try:
            yield
        finally:
            stateList.remove(workerThread)
 
    def _worker(self):
        ct 
= self.currentThread()
        
= self.q.get()
        
while o is not WorkerStop:
            with self._workerState(self.working, ct):
                function, args, kwargs, onResult 
= o
                
del o
                try:
                    result 
= function(*args, 
**kwargs)
                    success 
= True
                
except:
                    success 
= False
                    
if onResult is None:
                        pass
 
                    else:
                        pass
 
                del function, args, kwargs
 
                if onResult is not None:
                    try:
                        onResult(success, result)
                    except:
                        #context.call(ctx, log.err)
                        pass
 
                del onResult, result
 
            with self._workerState(self.waiters, ct):
                o 
= self.q.get()
 
    
def stop(self):
        while self.workers:
            self.q.put(WorkerStop)
            self.workers -
= 1
 
 
"""
def show(arg):
    import time
    time.sleep(1)
    print arg
 
 
pool 
= ThreadPool(20)
 
for i in range(500):
    pool.callInThread(show, i)
 
pool.start()
pool.stop()
"""

 

转载于:https://www.cnblogs.com/wulaoer/p/5122472.html

你可能感兴趣的文章
获取元素
查看>>
nginx+lighttpd+memcache+mysql配置与调试
查看>>
ubuntu12.04 启动apache2 对.htaccess 的支持
查看>>
proxy写监听方法,实现响应式
查看>>
前端工具----iconfont
查看>>
Azure Site Recovery 通过一键式流程将虚拟机故障转移至 Azure虚拟机
查看>>
Hello China操作系统STM32移植指南(一)
查看>>
cocos2dx CCEditBox
查看>>
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
查看>>
第一阶段冲刺06
查看>>
WIN下修改host文件并立即生效
查看>>
十个免费的 Web 压力测试工具
查看>>
ckeditor 粘贴后去除html标签
查看>>
面试题
查看>>
51Nod:活动安排问题之二(贪心)
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
数据库框架的log4j日志配置
查看>>
lintcode-easy-Remove Element
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>