首页 > 解决方案 > Python 中的多处理入门

问题描述

我正在尝试在我的脚本中设置一个多进程:我想遍历一个数组并为数组中的每个项目运行一个函数,但我希望同时调用这个函数。

这是原来的设置:

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 脚本”?我需要为此使用 aqueue吗?

标签: pythonqueuemultiprocessing

解决方案


您将不得不非常彻底地重组您的脚本以实现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的东西


推荐阅读