如何在Python中创建进程间数据结构?

时间:2012-10-23 15:04:21

标签: python multiprocessing shared-memory interprocess

我有一个包含字典(称为请求)的列表(称为requestRoster)。 'requests'字典中的项目是'requestTime'和'thisURL'之类的东西。例如:

[
{'thisURL': 'http://localhost/bikes', 'requestTime': datetime.datetime(2012, 10, 18, 0, 41, 34)}, 
{'thisURL': 'http://localhost/clothing', 'requestTime': datetime.datetime(2012, 10, 18, 0, 41, 35)}
]

我正在使用multiprocessing.Process生成一个新进程来发出每个请求。

我希望每个流程都更新requestRoster,为每个请求添加一个“响应”项。

我该怎么做?

我尝试使用multiprocessing.Manager()创建manager.list()和manager.Namespace()。不要让我做我想做的事情,我想因为这个: http://docs.python.org/library/multiprocessing.html#multiprocessing.managers.SyncManager.list

我想我可以使用multiprocessing.Lock()来

  • 获取互斥锁
  • 在流程
  • 中制作requestRoster的副本
  • 修改本地化的requestRoster
  • 使用本地化的
  • 覆盖'globablised'请求名单
  • 释放互斥锁

...但似乎有点复杂,我想知道我是否遗漏了一些更简单的东西。异步回调会很棒。

3 个答案:

答案 0 :(得分:2)

如果可以的话,避免使用共享内存结构会更好。在这里,您没有理由让进程写入自己的dicts列表 - 相反,您可以让主进程对此负责,并仅将URL提取到进程。

我喜欢concurrent.futures.<Process|Thread>PoolExecutor这类事情。

答案 1 :(得分:0)

我认为这种方法适合你:

分派器:

create logger_queue
create logger process, initialize with logger_queue
for each request
    create worker_pipe
    create worker process, initialize with send end of worker_pipe
    push receive end of worker_pipe over logger_queue

工人:

make request
push response over connection

记录器:

while True
    for connection on logger_queue
        create new element in logging list
        link connection to new logging list element
    for each open connection
        poll for message
        if message
            store message to log
            close connection

记录器进程也可以运行您想要的任何输出例程,因此您甚至不必担心从已记录的数据集中读取另一个进程。请注意,上面的连接是指multiprocessing.Connection

答案 2 :(得分:0)

我设法通过使用线程而不是多处理来实现这一点。由于工作人员与调度员处于同一过程中,因此他们可以更新requestRoster。