python - 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
吗?
解决方案
您将不得不非常彻底地重组您的脚本以实现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
的东西
推荐阅读
- c - Hello World shellcode 编译
- javascript - 更改部分颜色
- javascript - fetch和post之间有什么关系?
- json - 似乎无法使用 ASP.NET MVC 和实体框架返回我的模型
- function - 函数的使用/返回
- react-native - 错误:找不到导航对象。您的组件在 NavigationContainer 中吗?
- c++ - 源是通过 add_library 命令 PUBLIC 还是 PRIVATE 添加到库中的?
- arrays - 我想创建一个循环,它只通过矩阵中每一行中的第一个列
- swift - 是否可以在 SwiftUI 中捕获 VideoPlayer 的事件?
- mysql - 从三个不同的列中检索数据