我有一个包含500个输入文件的文件夹(所有文件的总大小约为500 [MB])。
我想编写一个执行以下操作的python
脚本:
(1)将所有输入文件加载到内存
(2)初始化稍后将使用的空python
列表...请参阅项目符号(4)
(3)启动15个不同的(独立的)进程:每个进程使用相同的输入数据[来自(1)
] - 但使用不同的算法来处理它,从而生成不同的结果
(4)我希望[来自步骤(3)
]的所有独立流程将其输出存储在相同的python
列表中[相同的列表中已初始化步骤(2)
]
一旦所有15个流程完成运行,我将one python list
包含所有15个独立流程的结果。
我的问题是,是否有可能在python
中有效地完成上述工作?如果是这样,你能提供一个方案/示例代码来说明如何做到吗?
注意#1:我将在一个强大的多核服务器上运行它;所以这里的目标是在所有独立进程中共享一些内存{input data
,output list
}时使用所有处理能力。
注意#2:我在Linux
环境中工作
答案 0 :(得分:6)
好吧,我刚刚使用zeromq向多个发布商展示了一个订阅者。您可能可以对队列执行相同的操作,但您需要更多地管理它们。 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