国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

用python實現的線程池實例代碼

2020-02-16 11:29:29
字體:
來源:轉載
供稿:網友

python3標準庫里自帶線程池ThreadPoolExecutor和進程池ProcessPoolExecutor。

如果你用的是python2,那可以下載一個模塊,叫threadpool,這是線程池。對于進程池可以使用python自帶的multiprocessing.Pool。

當然也可以自己寫一個threadpool。

# coding:utf-8 import Queueimport threadingimport sysimport timeimport math  class WorkThread(threading.Thread):   def __init__(self, task_queue):    threading.Thread.__init__(self)    self.setDaemon(True)    self.task_queue = task_queue    self.start()    self.idle = True   def run(self):    sleep_time = 0.01 # 第1次無任務可做時休息10毫秒    multiply = 0    while True:      try:        # 從隊列中取一個任務        func, args, kwargs = self.task_queue.get(block=False)        self.idle = False        multiply = 0        # 執行之        func(*args, **kwargs)      except Queue.Empty:        time.sleep(sleep_time * math.pow(2, multiply))        self.idle = True        multiply += 1        continue      except:        print sys.exc_info()        raise  class ThreadPool:   def __init__(self, thread_num=10, max_queue_len=1000):    self.max_queue_len = max_queue_len    self.task_queue = Queue.Queue(max_queue_len) # 任務等待隊列    self.threads = []    self.__create_pool(thread_num)   def __create_pool(self, thread_num):    for i in xrange(thread_num):      thread = WorkThread(self.task_queue)      self.threads.append(thread)   def add_task(self, func, *args, **kwargs):    '''添加一個任務,返回任務等待隊列的長度      調用該方法前最后先調用isSafe()判斷一下等待的任務是不是很多,以防止提交的任務被拒絕    '''    try:      self.task_queue.put((func, args, kwargs))    except Queue.Full:      raise # 隊列已滿時直接拋出異常,不給執行    return self.task_queue.qsize()   def isSafe(self):    '''等待的任務數量離警界線還比較遠    '''    return self.task_queue.qsize() < 0.9 * self.max_queue_len   def wait_for_complete(self):    '''等待提交到線程池的所有任務都執行完畢    '''    #首先任務等待隊列要變成空    while not self.task_queue.empty():      time.sleep(1)    # 其次,所以計算線程要變成idle狀態    while True:      all_idle = True      for th in self.threads:        if not th.idle:          all_idle = False          break      if all_idle:        break      else:        time.sleep(1)  if __name__ == '__main__':  def foo(a, b):    print a + b    time.sleep(0.01)  thread_pool = ThreadPool(10, 100)  '''在Windows上測試不通過,Windows上Queue.Queue不是線程安全的'''  size = 0  for i in xrange(10000):    try:      size = thread_pool.add_task(foo, i, 2 * i)    except Queue.Full:      print 'queue full, queue size is ', size  time.sleep(2)

總結

以上就是本文關于用python實現的線程池實例代碼的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洪湖市| 东光县| 绿春县| 宁国市| 罗江县| 林口县| 乐业县| 宁陕县| 沐川县| 乌鲁木齐县| 奉化市| 西峡县| 东明县| 荔浦县| 枣强县| 乌兰县| 成都市| 扎赉特旗| 新巴尔虎左旗| 太仓市| 砚山县| 定安县| 遵义县| 毕节市| 红河县| 尼勒克县| 桃源县| 西乌| 叶城县| 乳源| 承德县| 西昌市| 广饶县| 延吉市| 夏邑县| 措美县| 普洱| 专栏| 延安市| 棋牌| 仙桃市|