4

我有一个包含字典(称为请求)的列表(称为 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
  • 用本地化的请求名册覆盖“全球化”请求名册
  • 释放互斥锁

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

4

3 回答 3

2

如果可以的话,最好避免共享内存结构。在这里,您没有理由让进程自己写入字典列表 - 相反,您可以让主进程对此负责,并且只将 URL 提取分配给进程。

我喜欢concurrent.futures.<Process|Thread>PoolExecutor这种东西。

于 2012-10-23T15:19:49.720 回答
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.

于 2012-10-23T16:28:35.483 回答
0

我设法通过使用线程而不是多处理来做到这一点。因为工作人员与调度程序处于同一进程中,所以他们可以更新 requestRoster。

于 2012-10-23T21:36:36.570 回答