Python中线程池的实现(三)
发布时间:2020-05-24 23:43:20 所属栏目:Python 来源:互联网
导读:Python中线程池的实现(三)
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 # -*- coding: utf-8 -*-
# Java 理论与实践: 线程池与工作队列: http://www.ibm.com/developerworks/cn/java/j-jtp0730/
# 线程池原理及python实现: http://www.cnblogs.com/goodhacker/p/3359985.html
# Threadpool: http://chrisarndt.de/projects/threadpool/
# http://www.cnblogs.com/coser/archive/2012/03/10/2389264.html
import Queue
import threading
class ThreadPool(object):
def __init__(self,maxsize=4,timeout=1):
self._maxsize = maxsize
self._timeout = timeout
self._threads = []
self._work_queue = Queue.Queue()
self._create_threads()
def execute(self,func,*args,**kwargs):
self._work_queue.put((func,args,kwargs))
# self._append_thread()
def dismiss(self,do_join=False):
dismiss_list = []
for i in range(len(self._threads)):
thread = self._threads.pop()
thread.dismiss()
dismiss_list.append(thread)
if do_join:
for thread in dismiss_list:
thread.join()
def _create_threads(self):
for i in range(self._maxsize):
self._threads.append(WorkThread(self._work_queue,self._timeout))
# def _append_thread(self):
# num_thread = len(self._threads)
# if num_thread == self._maxsize:
# return
# num_work = self._work_queue.qsize()
# if num_thread >= num_work:
# return
# for i in range(num_thread,min(num_work,self._maxsize)):
# self._threads.append(WorkThread(self._work_queue,self._timeout))
class WorkThread(threading.Thread):
def __init__(self,work_queue,timeout=1):
super(WorkThread,self).__init__()
self._work_queue = work_queue
self._timeout = timeout
self._dismissed = threading.Event()
self.start()
def run(self):
while True:
if self._dismissed.isSet()
and self._work_queue.qsize() == 0:
break
try:
func,kwargs = self._work_queue.get(True,self._timeout)
except Queue.Empty:
continue
else:
func(*args,**kwargs)
# print("%s exited!" % threading.current_thread())
def dismiss(self):
self._dismissed.set()
if __name__ == '__main__':
import time
def do_sth(n):
time.sleep(0.1)
print("task%s in %s" % (n,threading.current_thread()))
pool = ThreadPool()
for i in range(0,20):
pool.execute(do_sth,i)
pool.dismiss(True)
print("completed!")
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
