| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
n672
10年前发布

Python中线程池的实现(三)

# -*- 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, args, 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!")