在python中的进程之间传输数据

时间:2018-06-19 02:07:17

标签: python

我不是python的新手,但仍在寻找在进程之间共享字符串格式数据的最佳方式。

目前我有4个进程(多个进程中有1个父进程+ 3个子进程),父进程是从长轮询服务器获取数据,经过几次检查后发送数据到mysql服务器。

然后,Childs(每种任务1个)正在以我需要的方式处理数据。

现在一切正常,我的数据安全存储并始终处于访问状态,特别是如果我需要调试或实现新功能,但毕竟它在项目增长时效果较慢(对于Web应用程序 - 不好)。 正如您可能认为的那样,存储在db中的数据类型是列表或其对象。 我知道在python中有一些问题,在进程之间传输数据(更好的说,软件限制)......

我在考虑在JSON或简单的txt文件中临时存储数据,但并发性不允许我这样做。我也可以尝试使用套接字,但为此目的启动回调服务器是否值得?

异步的东西对我来说也不起作用。那么在这种情况下我的选择是什么?我不需要丢失任何数据,就像我需要保持它快速工作一样。欢迎采取任何其他措施:)

p.s大多数相关主题都已过时或未回答我的问题,因为我确信到目前为止我处理数据的方式并不是最好的。

2 个答案:

答案 0 :(得分:1)

有很多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)

答案 1 :(得分:1)

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,它允许进程之间进行双向数据传输。