我正在尝试在我的脚本中设置一个多进程:我想遍历数组并为数组中的每个项目运行一个函数,但我希望同时调用这个函数。
这是原始设置:
def my_function(my_variable):
#DO stuff
return my_variable_updated
def main():
#initialize my_variable as a list with 10000 items
results = []
for item in my_variable:
results.append(my_function(item))
#continue script
如何将其转换为多处理,以便我可以同时运行多个my_functions
并更快地进入"#continue 脚本"?我需要为此使用queue
吗?
您必须非常彻底地重组脚本才能实现multiprocessing
。主脚本如下所示:
from multiprocessing import Process, JoinableQueue, Manager
def my_function(input_queue, manager_list):
while True:
item_to_process = input_queue.get() # item_to_process will be an (index, item) tuple
result_of_processing = item_to_process[1] ** 2
manager_list[item_to_process[0]] = result_of_processing
input_queue.task_done()
def main():
item_count = 10 # 10000 in your case
my_variable = [i for i in range(item_count)]
q = JoinableQueue()
for index, item in enumerate(my_variable):
q.put((index, item))
manager = Manager()
results = manager.list([0] * item_count) # initialize to same size as my_variable
worker_count = 2
for _ in range(worker_count):
p = Process(target=my_function, args=[q, results])
p.daemon = True # optional, but should be used unless your subprocess will spawn another process
p.start()
# now you can continue on
# but when you need to access `results` you have to put:
q.join()
# now we have our results
print(results)
if __name__ == "__main__":
main()
耶尔丁
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在我的简单情况下。
你也可以使用游泳池,但我对此并不精通,也不想让你误入歧途。
使用多处理时要注意的主要事情是避免死锁,并保持共享内存,而且它很快就会变得棘手!在大多数情况下,建议改用threading.Thread
就足够了!这个模块非常容易烹饪,但你仍然可能需要一个queue.Queue
。但是,您不必担心共享内存和诸如multiprocessing.Manager
之类的事情。