<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      python類庫32[多進程通信Queue+Pipe+Value+Array]


      多進程通信

      queue和pipe的區別: pipe用來在兩個進程間通信。queue用來在多個進程間實現通信。 此兩種方法為所有系統多進程通信的基本方法,幾乎所有的語言都支持此兩種方法。

       

      1)Queue & JoinableQueue

      queue用來在進程間傳遞消息,任何可以pickle-able的對象都可以在加入到queue。 

      multiprocessing.JoinableQueue 是 Queue的子類,增加了task_done()和join()方法。

       

      task_done()用來告訴queue一個task完成。一般地在調用get()獲得一個task,在task結束后調用task_done()來通知Queue當前task完成。

      join() 阻塞直到queue中的所有的task都被處理(即task_done方法被調用)。


      代碼:

      import multiprocessing
      import time

      class Consumer(multiprocessing.Process):
          
          def __init__(self, task_queue, result_queue):
              multiprocessing.Process.__init__(self)
              self.task_queue = task_queue
              self.result_queue = result_queue

          def run(self):
              proc_name = self.name
              while True:
                  next_task = self.task_queue.get()
                  if next_task is None:
                      # Poison pill means shutdown
                      print ('%s: Exiting' % proc_name)
                      self.task_queue.task_done()
                      break
                  print ('%s: %s' % (proc_name, next_task))
                  answer = next_task() # __call__()
                  self.task_queue.task_done()
                  self.result_queue.put(answer)
              return


      class Task(object):
          def __init__(self, a, b):
              self.a = a
              self.b = b
          def __call__(self):
              time.sleep(0.1) # pretend to take some time to do the work
              return '%s * %s = %s' % (self.a, self.b, self.a * self.b)
          def __str__(self):
              return '%s * %s' % (self.a, self.b)


      if __name__ == '__main__':
          # Establish communication queues
          tasks = multiprocessing.JoinableQueue()
          results = multiprocessing.Queue()
          
          # Start consumers
          num_consumers = multiprocessing.cpu_count()
          print ('Creating %d consumers' % num_consumers)
          consumers = [ Consumer(tasks, results)
                        for i in range(num_consumers) ]
          for w in consumers:
              w.start()
          
          # Enqueue jobs
          num_jobs = 10
          for i in range(num_jobs):
              tasks.put(Task(i, i))
          
          # Add a poison pill for each consumer
          for i in range(num_consumers):
              tasks.put(None)

          # Wait for all of the tasks to finish
          tasks.join()
          
          # Start printing results
          while num_jobs:
              result = results.get()
              print ('Result:', result)
              num_jobs -= 1

       注意小技巧: 使用None來表示task處理完畢。

       

      運行結果:


       

      2) pipe

       

      pipe()返回一對連接對象,代表了pipe的兩端。每個對象都有send()和recv()方法。

       

       

      代碼:

       

      from multiprocessing import Process, Pipe

      def f(conn):
          conn.send([42, None, 'hello'])
          conn.close()

      if __name__ == '__main__':
          parent_conn, child_conn = Pipe()
          p = Process(target=f, args=(child_conn,))
          p.start()
          p.join()
          print(parent_conn.recv())   # prints "[42, None, 'hello']"

       

       

      3)Value + Array

      Value + Array 是python中共享內存 映射文件的方法,速度比較快。

      from multiprocessing import Process, Value, Array

      def f(n, a):
          n.value = n.value + 1
          for i in range(len(a)):
              a[i] = a[i] * 10

      if __name__ == '__main__':
          num = Value('i', 1)
          arr = Array('i', range(10))

          p = Process(target=f, args=(num, arr))
          p.start()
          p.join()

          print(num.value)
          print(arr[:])
          
          p2 = Process(target=f, args=(num, arr))
          p2.start()
          p2.join()

          print(num.value)
          print(arr[:])

      # the output is :
      #
       2
      #
       [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
      #
       3
      #
       [0, 100, 200, 300, 400, 500, 600, 700, 800, 900]


      參考:
      The Python Standard Library By Example

      http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html 

       

      完! 

      posted @ 2012-01-09 16:38  iTech  閱讀(6181)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中文字幕一区二区精品区| 欧美成人黄在线观看| 精品无码一区二区三区电影| 亚洲午夜理论无码电影| 欧美特级午夜一区二区三区| 小伙无套内射老熟女精品| 女人与牲口性恔配视频免费| 国产高清在线精品一区二区三区 | 日韩熟妇中文色在线视频| 久久国产乱子伦免费精品无码| 一区二区丝袜美腿视频| 蜜臀精品一区二区三区四区| 国产又色又爽又黄的视频在线| 久久天天躁狠狠躁夜夜躁2o2o| 亚洲av中文一区二区| 有码中文字幕一区三区| 国产高清自产拍av在线| 妺妺窝人体色www聚色窝仙踪| 91产精品无码无套在线| 亚洲婷婷综合色高清在线| 午夜精品福利一区二区三| 少妇人妻偷人精品视频| 国产av寂寞骚妇| 国产边摸边吃奶边叫做激情视频| 亚洲狼人久久伊人久久伊| 欧美在线观看www| 亚洲丶国产丶欧美一区二区三区| 无码av免费毛片一区二区| 99精品国产精品一区二区| 亚洲日韩精品无码一区二区三区 | 亚洲精品动漫一区二区三| 亚洲区综合区小说区激情区| 极品无码国模国产在线观看| 亚洲熟女精品一区二区| 亚洲国产高清在线观看视频| 美女黄18以下禁止观看| 日韩精品国产另类专区| 免费一级黄色好看的国产| 疯狂做受XXXX高潮国产| 翘臀少妇被扒开屁股日出水爆乳| 人人妻人人做人人爽夜欢视频 |