欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python進程間數(shù)據(jù)交互的幾種實現(xiàn)方式

 更新時間:2023年05月31日 09:55:45   作者:處女座_三月  
本文主要介紹了python進程數(shù)據(jù)交互的幾種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一 方法匯總

在 Python 進程中,有幾種方法可以實現(xiàn)數(shù)據(jù)交互:

  • 共享內(nèi)存:這是一種用于進程間通信的高效方式。多個進程可以訪問同一個共享內(nèi)存區(qū)域,并在其中讀取和寫入數(shù)據(jù)。
  • 管道(Pipe):這是一種用于進程間通信的基本方式。管道可以在兩個進程之間傳遞數(shù)據(jù)。一個進程將數(shù)據(jù)寫入管道,另一個進程從管道中讀取數(shù)據(jù)。
  • 隊列(Queue):隊列也是一種進程間通信的方式。一個進程將數(shù)據(jù)放入隊列,另一個進程從隊列中獲取數(shù)據(jù)。
  • 套接字(Socket):套接字是一種用于網(wǎng)絡(luò)通信的方式,但它們也可以在同一臺計算機上進行進程間通信。每個套接字都有一個唯一的地址,進程可以使用這個地址來發(fā)送和接收數(shù)據(jù)。
  • 文件:進程可以使用文件作為數(shù)據(jù)交換的方式。一個進程將數(shù)據(jù)寫入文件,另一個進程從文件中讀取數(shù)據(jù)。

二 實際舉例

2.1 共享內(nèi)存

使用 multiprocessing.Value 可以創(chuàng)建進程間共享的變量,下面是一個例子,創(chuàng)建了一個類型為整數(shù)('i')的共享內(nèi)存變量 value,然后啟動 10 個進程去調(diào)用 func 函數(shù),該函數(shù)會將 value 的值加 1。最后輸出 value 的值,應(yīng)該是 10:

import multiprocessing
def func(value):
    value.value += 1
if __name__ == '__main__':
    value = multiprocessing.Value('i', 0)
    processes = [multiprocessing.Process(target=func, args=(value,)) for _ in range(10)]
    for process in processes:
        process.start()
    for process in processes:
        process.join()
    print(value.value) # 輸出 10

2.2 管道

使用 multiprocessing.Pipe 可以創(chuàng)建一個管道,兩個進程可以通過這個管道互相傳遞數(shù)據(jù),下面是一個例子,創(chuàng)建了一個管道,其中 parent_conn 是父進程持有的端口,child_conn 是子進程持有的端口。然后啟動兩個進程,分別調(diào)用 sender 和 receiver 函數(shù)。sender 函數(shù)發(fā)送一條消息到管道中,receiver 函數(shù)從管道中接收消息并打印出來:

import multiprocessing
def sender(conn):
    conn.send('Hello, receiver')
def receiver(conn):
    message = conn.recv()
    print(message)
if __name__ == '__main__':
    parent_conn, child_conn = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=sender, args=(parent_conn,))
    p2 = multiprocessing.Process(target=receiver, args=(child_conn,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

2.3 隊列

使用 multiprocessing.Queue 可以創(chuàng)建一個進程間共享的隊列,多個進程可以通過這個隊列互相傳遞數(shù)據(jù),下面是一個例子,創(chuàng)建了一個進程間共享的隊列 q,然后啟動了四個進程去調(diào)用 worker 函數(shù),該函數(shù)會從隊列中獲取數(shù)據(jù)并打印出來。主進程向隊列中發(fā)送 10 個數(shù)值,每個進程都會從隊列中獲取數(shù)據(jù)并進行處理。當(dāng)主進程發(fā)送完所有內(nèi)容后,向隊列中發(fā)送 N 個 None 值(N 等于進程數(shù)量),以通知各進程退出:

import multiprocessing
def worker(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(item)
if __name__ == '__main__':
    q = multiprocessing.Queue()
    processes = [multiprocessing.Process(target=worker, args=(q,)) for _ in range(4)]
    for process in processes:
        process.start()
    for i in range(10):
        q.put(i)
    for _ in range(len(processes)):
        q.put(None)
    for process in processes:
        process.join()

2.4 套接字

使用 Python 的 socket 模塊可以創(chuàng)建套接字,進而實現(xiàn)網(wǎng)絡(luò)通信和進程間通信。下面是一個簡單的例子,創(chuàng)建了一個服務(wù)器進程和一個客戶端進程。服務(wù)器進程監(jiān)聽本機的 8888 端口,接收客戶端發(fā)來的數(shù)據(jù)并打印出來;客戶端進程連接服務(wù)器的 8888 端口,并向服務(wù)器發(fā)送一條消息。運行上述代碼后,可以看到服務(wù)器進程收到客戶端發(fā)送的消息并打印出來:

import socket
def server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('127.0.0.1', 8888))
    server_socket.listen(1)
    conn, addr = server_socket.accept()
    while True:
        data = conn.recv(1024)
        if not data:
            break
        print(data.decode())
    conn.close()
    server_socket.close()
def client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('127.0.0.1', 8888))
    client_socket.sendall(b'Hello, server')
    client_socket.close()
if __name__ == '__main__':
    import multiprocessing
    server_process = multiprocessing.Process(target=server)
    client_process = multiprocessing.Process(target=client)
    server_process.start()
    client_process.start()
    server_process.join()
    client_process.join()

2.5 文件

在 Python 中使用文件進行進程間通信也是比較常見的方式。下面是一個例子,創(chuàng)建了一個文件 test.txt,該文件包含了三行文本。然后啟動兩個進程去調(diào)用 worker 函數(shù),該函數(shù)會讀取文件內(nèi)容并打印出來。當(dāng)兩個進程都完成任務(wù)后,主進程結(jié)束。運行上述代碼后,可以看到兩個進程分別打印了 test.txt 文件的內(nèi)容:

import multiprocessing
def worker(file):
    with open(file, 'r') as f:
        for line in f:
            print(line.rstrip())
if __name__ == '__main__':
    filename = 'test.txt'
    with open(filename, 'w') as f:
        f.write('Line 1\n')
        f.write('Line 2\n')
        f.write('Line 3\n')
    processes = [multiprocessing.Process(target=worker, args=(filename,)) for _ in range(2)]
    for process in processes:
        process.start()
    for process in processes:
        process.join()

三 python子進程傳數(shù)據(jù)到主進程的方式

Python中有多種方式可以讓子進程傳遞數(shù)據(jù)給主進程。這里我列舉其中三種比較常用的方式:

  • 使用隊列(Queue):隊列是多進程編程中常用的通信工具,可以在多個進程之間傳遞消息。在主進程中初始化一個隊列對象,然后將其作為參數(shù)傳遞給子進程,在子進程中使用put()方法向隊列中添加數(shù)據(jù),主進程可以使用get()方法獲取數(shù)據(jù)。

下面是一個使用隊列實現(xiàn)子進程傳遞數(shù)據(jù)給主進程的例子:

import multiprocessing as mp
def func(queue):
    # 子進程向隊列中添加數(shù)據(jù)
    queue.put("hello from child process")
if __name__ == '__main__':
    # 初始化一個隊列
    queue = mp.Queue()
    # 創(chuàng)建一個子進程并將隊列作為參數(shù)傳遞給它
    p = mp.Process(target=func, args=(queue,))
    p.start()
    # 主進程從隊列中獲取數(shù)據(jù)
    data = queue.get()
    print(data)
  • 使用管道(Pipe):管道也可以在多個進程之間傳遞消息,不同于隊列的是它只支持兩個進程之間的通信。在主進程中創(chuàng)建一個管道,然后將其作為參數(shù)傳遞給子進程,在子進程中使用send()方法向管道中發(fā)送數(shù)據(jù),主進程可以使用recv()方法接收數(shù)據(jù)。

下面是一個使用管道實現(xiàn)子進程傳遞數(shù)據(jù)給主進程的例子:

import multiprocessing as mp
def func(pipe):
    # 子進程向管道中發(fā)送數(shù)據(jù)
    pipe.send("hello from child process")
if __name__ == '__main__':
    # 創(chuàng)建一個管道
    parent_conn, child_conn = mp.Pipe()
    # 創(chuàng)建一個子進程并將管道作為參數(shù)傳遞給它
    p = mp.Process(target=func, args=(child_conn,))
    p.start()
    # 主進程從管道中接收數(shù)據(jù)
    data = parent_conn.recv()
    print(data)
  • 使用共享內(nèi)存(Value和Array):共享內(nèi)存可以讓多個進程之間共享同一塊內(nèi)存區(qū)域,這樣就可以避免進程之間頻繁地復(fù)制數(shù)據(jù)。在主進程中使用Value或Array創(chuàng)建一個共享內(nèi)存對象,然后將其作為參數(shù)傳遞給子進程,在子進程中可以直接修改共享內(nèi)存對象中的值,主進程也可以直接讀取共享內(nèi)存對象中的值。

下面是一個使用共享內(nèi)存實現(xiàn)子進程傳遞數(shù)據(jù)給主進程的例子:

import multiprocessing as mp
def func(val):
    # 子進程修改共享內(nèi)存對象中的值
    val.value = 123
if __name__ == '__main__':
    # 創(chuàng)建一個共享內(nèi)存對象
    val = mp.Value('i', 0)
    # 創(chuàng)建一個子進程并將共享內(nèi)存對象作為參數(shù)傳遞給它
    p = mp.Process(target=func, args=(val,))
    p.start()
    # 主進程讀取共享內(nèi)存對象中的值
    print(val.value)

到此這篇關(guān)于python進程數(shù)據(jù)交互的幾種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)python進程數(shù)據(jù)交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pandas把所有大于0的數(shù)設(shè)置為1的方法

    pandas把所有大于0的數(shù)設(shè)置為1的方法

    今天小編就為大家分享一篇pandas把所有大于0的數(shù)設(shè)置為1的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python散列表(Hash Table)的實現(xiàn)示例

    Python散列表(Hash Table)的實現(xiàn)示例

    散列表是一種常用于實現(xiàn)關(guān)聯(lián)數(shù)組或映射的數(shù)據(jù)結(jié)構(gòu),本文我們將深入講解Python中的散列表,包括散列函數(shù)、沖突解決方法、散列表的實現(xiàn)和應(yīng)用場景,感興趣的可以了解一下
    2024-01-01
  • Django實現(xiàn)在線無水印抖音視頻下載(附源碼及地址)

    Django實現(xiàn)在線無水印抖音視頻下載(附源碼及地址)

    該項目功能簡單,完全復(fù)制SaveTweetVedio的項目。用戶觀看抖音視頻時選擇復(fù)制視頻鏈接,輸入到下載輸入欄,即可下載無水印視頻,還可掃描二維碼手機上預(yù)覽。親測成功。
    2021-05-05
  • python 還原梯度下降算法實現(xiàn)一維線性回歸

    python 還原梯度下降算法實現(xiàn)一維線性回歸

    這篇文章主要介紹了python 還原梯度下降算法實現(xiàn)一維線性回歸,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python 兩個列表的差集、并集和交集實現(xiàn)代碼

    Python 兩個列表的差集、并集和交集實現(xiàn)代碼

    這篇文章主要介紹了Python 兩個列表的差集、并集和交集實現(xiàn)代碼,需要的朋友可以參考下
    2016-09-09
  • opencv python 圖片讀取與顯示圖片窗口未響應(yīng)問題的解決

    opencv python 圖片讀取與顯示圖片窗口未響應(yīng)問題的解決

    這篇文章主要介紹了opencv python 圖片讀取與顯示圖片窗口未響應(yīng)問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python編程使用NLTK進行自然語言處理詳解

    Python編程使用NLTK進行自然語言處理詳解

    這篇文章主要介紹了Python編程使用NLTK進行自然語言處理詳解,涉及了nltk和開發(fā)環(huán)境的簡單介紹,以及SentencesSegment,SentencesSegment等內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 用python實現(xiàn)名片管理系統(tǒng)

    用python實現(xiàn)名片管理系統(tǒng)

    這篇文章主要為大家詳細介紹了用python實現(xiàn)名片管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 打包Python代碼的常用方法小結(jié)

    打包Python代碼的常用方法小結(jié)

    Python是一門強大的編程語言,但在將Python代碼分享給其他人時,讓他們安裝Python解釋器并運行腳本可能有點繁瑣,這時,將Python代碼打包成可執(zhí)行的應(yīng)用程序(.exe)可以大大簡化這個過程,本文將介紹幾種常用的方法,輕松地將Python代碼變成獨立的可執(zhí)行文件
    2023-11-11
  • 撤回我也能看到!教你用Python制作微信防撤回腳本

    撤回我也能看到!教你用Python制作微信防撤回腳本

    如果好友短時間發(fā)送多條消息然后撤回會難以判斷究竟撤回的是哪條信息,只能靠猜.后來我覺得“猜”這個事情特別不Pythonic,研究一段時間后找到了解決方案,不得不驚嘆ItChat真的好強大,需要的朋友可以參考下
    2021-06-06

最新評論