我有一个包含字典(称为请求)的列表(称为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()来
...但似乎有点复杂,我想知道我是否遗漏了一些更简单的东西。异步回调会很棒。
答案 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。