簡體   English   中英

在python中的進程之間傳輸數據

[英]transferring data between processes in python

我對python並不陌生,但仍在尋找在進程之間共享字符串格式數據的最佳方法。

目前,我有4個進程(1個父進程+ 3個多進程子進程),父進程正在從長輪詢服務器中獲取數據,並且經過幾次檢查后才將數據發送到mysql服務器。

然后,Childs(每種任務為1)正在按照我需要的方式處理數據。

目前一切正常,我的數據已安全存儲並可以隨時訪問,尤其是在我需要調試或實現新功能的情況下,但畢竟隨着項目的增長,它的工作速度會變慢(對於Web應用程序-不好)。 您可能會假設,存儲在db中的數據類型是list或其對象。 我知道python在進程之間傳輸數據存在一些問題(最好是軟件限制)...

我當時正在考慮將數據臨時存儲在JSON或簡單的txt文件中,但是並發不允許我這樣做。 我也可以嘗試使用套接字,但是為此目的啟動回調服務器是否值得?

異步的東西對我也不起作用。 那么在這種情況下我有什么選擇呢? 我不需要丟失任何數據,就像我需要使其保持快速運轉一樣。 任何其他措施,歡迎:)

ps大多數相關主題已經過時或沒有回答我的問題,因為我確信到目前為止,我處理數據的方式並不是最好的。

IPC有很多方法(套接字,共享內存,管道,FIFO ...),我認為您可以嘗試使用pipe ,這很簡單。 請參閱以下示例:

import os, sys


def child(prefix, r, w):
    os.close(w)
    print(prefix + ':read')
    s = os.read(r, 1024)
    print(prefix + ':got:' + s)
    print(prefix + ':close')
    os.close(r)
    print(prefix + ':exit')
    sys.exit(0)


r0, w0 = os.pipe()
r1, w1 = os.pipe()
r2, w2 = os.pipe()

if os.fork():
    if os.fork():
        if os.fork():
            os.close(r0)
            os.close(r1)
            os.close(r2)
            print('p:write')
            os.write(w0, 'hello world')
            os.write(w1, 'hello world')
            os.write(w2, 'hello world')
            print('p:close')
            os.close(w0)
            os.close(w1)
            os.close(w2)
            print('p:exit')
            sys.exit(0)
        else:
            child('c0', r0, w0)
    else:
        child('c1', r1, w1)
else:
    child('c2', r2, w2)

multiprocessing模塊提供了執行此操作的一些工具: https : //docs.python.org/3.6/library/multiprocessing.html#exchanging-objects-between-processes

具體來看一下Queue 任何進程都可以將消息推送到隊列中或從隊列中彈出消息。 因此,例如,父母可以執行任務,孩子可以等待任務,並以先到先得的方式獲得任務。 如果一個孩子正忙於完成該任務,則下一個孩子會接受。

例如,如果您需要子進程來處理父進程獲取的數據,則可能會有以下內容:

from multiprocessing import Process, Queue

def do_thing(q):
    data = q.get()  # Get data queued by the parent process
    # do something with data

if __name__ == '__main__':
    q = Queue()
    p = Process(target=do_thing, args=(q,))
    p.start()
    while True:
        data = get_data_from_server()
        q.put(data)  # Queue data for a child server

如果您想要更基本的東西,可以使用Pipe ,它允許在進程之間進行雙向數據傳輸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM