最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多進(jìn)程通信Queue、Pipe、Value、Array實(shí)例

 更新時(shí)間:2014年11月21日 09:44:11   投稿:junjie  
這篇文章主要介紹了Python多進(jìn)程通信Queue、Pipe、Value、Array實(shí)例,queue和pipe用來在進(jìn)程間傳遞消息、Value + Array 是python中共享內(nèi)存映射文件的方法,需要的朋友可以參考下

queue和pipe的區(qū)別: pipe用來在兩個(gè)進(jìn)程間通信。queue用來在多個(gè)進(jìn)程間實(shí)現(xiàn)通信。 此兩種方法為所有系統(tǒng)多進(jìn)程通信的基本方法,幾乎所有的語言都支持此兩種方法。

1)Queue & JoinableQueue

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

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

task_done()用來告訴queue一個(gè)task完成。一般地在調(diào)用get()獲得一個(gè)task,在task結(jié)束后調(diào)用task_done()來通知Queue當(dāng)前task完成。

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

代碼:

復(fù)制代碼 代碼如下:

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

運(yùn)行結(jié)果:

2)pipe

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

代碼:

復(fù)制代碼 代碼如下:

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中共享內(nèi)存 映射文件的方法,速度比較快。

復(fù)制代碼 代碼如下:

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]

相關(guān)文章

  • 利用rest framework搭建Django API過程解析

    利用rest framework搭建Django API過程解析

    這篇文章主要介紹了利用rest framework搭建Django API過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python實(shí)現(xiàn)向QQ群成員自動(dòng)發(fā)郵件的方法

    Python實(shí)現(xiàn)向QQ群成員自動(dòng)發(fā)郵件的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)向QQ群成員自動(dòng)發(fā)郵件的方法,通過讀取txt文本里的QQ成員數(shù)據(jù)再調(diào)用發(fā)送郵件函數(shù)實(shí)現(xiàn)該功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • Python實(shí)現(xiàn)合并兩個(gè)列表的方法分析

    Python實(shí)現(xiàn)合并兩個(gè)列表的方法分析

    這篇文章主要介紹了Python實(shí)現(xiàn)合并兩個(gè)列表的方法,結(jié)合實(shí)例形式對比分析了常見的Python列表合并操作技巧,需要的朋友可以參考下
    2018-05-05
  • Python中迭代器的創(chuàng)建與使用詳解

    Python中迭代器的創(chuàng)建與使用詳解

    Python中的迭代器是一個(gè)對象,用于迭代可迭代對象,如列表,元組,字典和集合,這篇文章主要為大家介紹了Python中迭代器的創(chuàng)建與使用,需要的可以參考下
    2023-08-08
  • Python 中省略號對象的使用

    Python 中省略號對象的使用

    作為一名經(jīng)驗(yàn)豐富的 Python 開發(fā)人員,您可能遇到過 Python 中的三個(gè)點(diǎn)…省略號對象, 如果您嘗試在 Python 解釋器中打印此內(nèi)容,它將顯示一個(gè)省略號,本篇文章將介紹 Python 中省略號對象的使用,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Python實(shí)現(xiàn)冒泡,插入,選擇排序簡單實(shí)例

    Python實(shí)現(xiàn)冒泡,插入,選擇排序簡單實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)冒泡,插入,選擇排序簡單實(shí)例,很適合Python初學(xué)者學(xué)習(xí)參考之用,需要的朋友可以參考下
    2014-08-08
  • python通過裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法

    python通過裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法

    這篇文章主要介紹了python通過裝飾器檢查函數(shù)參數(shù)數(shù)據(jù)類型的方法,涉及Python裝飾器的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • python中pickle模塊淺析

    python中pickle模塊淺析

    在本篇文章里小編給大家整理的是關(guān)于python中pickle模塊的基礎(chǔ)知識點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Appium自動(dòng)化測試實(shí)現(xiàn)九宮格解鎖

    Appium自動(dòng)化測試實(shí)現(xiàn)九宮格解鎖

    本文主要介紹了Appium自動(dòng)化測試實(shí)現(xiàn)九宮格解鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python基礎(chǔ)之Spyder的使用

    Python基礎(chǔ)之Spyder的使用

    Spyder是一個(gè)用于科學(xué)計(jì)算的使用Python編程語言的集成開發(fā)環(huán)境(IDE),它結(jié)合了綜合開發(fā)工具的高級編輯、分析、調(diào)試等功能,需要的朋友可以參考下
    2023-05-05

最新評論

南通市| 娄烦县| 前郭尔| 汶上县| 滨州市| 开远市| 喜德县| 大兴区| 丹寨县| 如东县| 饶平县| 赞皇县| 松原市| 三门峡市| 丰台区| 土默特右旗| 同心县| 广饶县| 安龙县| 台山市| 呈贡县| 安丘市| 湘潭县| 阿拉善右旗| 阳泉市| 黔西| 新干县| 隆安县| 五原县| 丘北县| 阳西县| 虎林市| 家居| 北碚区| 苏尼特右旗| 凤凰县| 青铜峡市| 临西县| 光泽县| 元氏县| 阿荣旗|