我有一个包含 500 个输入文件的文件夹(所有文件的总大小约为 500[MB])。
我想写一个python
执行以下操作的脚本:
(1)将所有输入文件加载到内存中
(2)初始化一个空的python
稍后将使用的列表...参见项目符号(4)
(3)启动 15 个不同(独立)进程:每个进程都使用相同的输入数据 [来自(1)
] -- 但使用不同的算法来处理它,从而产生不同的结果
(4)我想要所有独立的进程[从步骤(3)
] 将它们的输出存储在同一个中python
列表 [与步骤中初始化的列表相同(2)
]
一旦所有 15 个进程都完成运行,我将有one python list
其中包括所有 15 个独立流程的结果。
我的问题是,是否可以有效地完成上述工作python
?如果是这样,您能否提供一个方案/示例代码来说明如何做到这一点?
Note #1:我将在强大的多核服务器上运行它;所以这里的目标是使用所有处理能力,同时共享一些内存{input data
, output list
} 在所有独立进程中。
Note #2:我在一家Linux
环境
好的,我只是用它来完成这个zeromq http://zguide.zeromq.org/page%3aall向多个发布者展示单个订阅者。您可能可以对队列执行相同的操作,但您需要对它们进行更多管理。 Zeromq 套接字可以正常工作,这对于 IMO 之类的事情来说非常有用。
"""
demo of multiple processes doing processing and publishing the results
to a common subscriber
"""
from multiprocessing import Process
class Worker(Process):
def __init__(self, filename, bind):
self._filename = filename
self._bind = bind
super(Worker, self).__init__()
def run(self):
import zmq
import time
ctx = zmq.Context()
result_publisher = ctx.socket(zmq.PUB)
result_publisher.bind(self._bind)
time.sleep(1)
with open(self._filename) as my_input:
for l in my_input.readlines():
result_publisher.send(l)
if __name__ == '__main__':
import sys
import os
import zmq
#assume every argument but the first is a file to be processed
files = sys.argv[1:]
# create a worker for each file to be processed if it exists pass
# in a bind argument instructing the socket to communicate via ipc
workers = [Worker(f, "ipc://%s_%s" % (f, i)) for i, f \
in enumerate((x for x in files if os.path.exists(x)))]
# create subscriber socket
ctx = zmq.Context()
result_subscriber = ctx.socket(zmq.SUB)
result_subscriber.setsockopt(zmq.SUBSCRIBE, "")
# wire up subscriber to whatever the worker is bound to
for w in workers:
print w._bind
result_subscriber.connect(w._bind)
# start workers
for w in workers:
print "starting workers..."
w.start()
result = []
# read from the subscriber and add it to the result list as long
# as at least one worker is alive
while [w for w in workers if w.is_alive()]:
result.append(result_subscriber.recv())
else:
# output the result
print result
哦,要得到 zmq
$ pip install pyzmq-static
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)