一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python多進程通信Queue、Pipe、Value、Array實例

Python多進程通信Queue、Pipe、Value、Array實例

2020-05-14 09:36腳本之家 Python

這篇文章主要介紹了Python多進程通信Queue、Pipe、Value、Array實例,queue和pipe用來在進程間傳遞消息、Value + Array 是python中共享內存映射文件的方法,需要的朋友可以參考下

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處理完畢。

運行結果:

Python多進程通信Queue、Pipe、Value、Array實例

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]

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本天堂影院在线播放 | 国产男人天堂 | 深夜激情网站 | 国产精品1024永久免费视频 | 欧美日韩高清完整版在线观看免费 | 天堂在线国产 | 免费国产高清精品一区在线 | 亚洲国产中文字幕在线视频综合 | 四虎影视4hu最新地址在线884 | 国产福利一区二区三区 | 国产在线视频在线观看 | 2020国产精品视频 | 久久国产香蕉 | 亚洲成人在线播放 | 青草国产在线视频 | 好大好深好涨好烫还要 | 日本人作爰啪啪全过程 | 1024亚洲天堂 | 四虎国产精品视频免费看 | 午夜欧美精品久久久久久久久 | 国产亚洲福利一区二区免费看 | sss亚洲国产欧美一区二区 | 成年人福利 | 亚洲一卡2卡4卡5卡6卡残暴在线 | 欧美xxxxx69| 暖暖暖免费观看在线观看 | 无码AV熟妇素人内射V在线 | 欧美日韩一二三区免费视频观看 | 人人看人人射 | 国产成人精品实拍在线 | 精品一产品大全 | chinesemature丰满成熟 | 国产伦精一区二区三区视频 | 久久视热频国产这里只有精品23 | 亚洲 欧美 中文 日韩欧美 | 精品欧美一区二区精品久久 | 虎四免费入口 | 精品日韩二区三区精品视频 | 美女视频黄a | 亚洲网红精品大秀在线观看 | а天堂中文最新版在线 |