在Python中使用多处理的简单进程管理器
我有许多需要执行的任务(彼此独立,由Python中的一些代码表示)。它们的执行时间各不相同。我也有有限的资源,因此最多可以同时运行N个任务。目标是尽可能快地完成整个任务堆栈的执行 似乎我正在寻找一种管理器,当资源可用时启动新任务并收集完成的任务在Python中使用多处理的简单进程管理器,python,multiprocessing,Python,Multiprocessing,我有许多需要执行的任务(彼此独立,由Python中的一些代码表示)。它们的执行时间各不相同。我也有有限的资源,因此最多可以同时运行N个任务。目标是尽可能快地完成整个任务堆栈的执行 似乎我正在寻找一种管理器,当资源可用时启动新任务并收集完成的任务 是否有任何已经制定的解决方案,或者我应该自己编写 有什么需要我记住的注意事项吗 以下是一个简单的代码片段,它应该符合要求: import multiprocessing import time POOL_SIZE = 4 STEP = 1 def
- 是否有任何已经制定的解决方案,或者我应该自己编写
- 有什么需要我记住的注意事项吗
- 以下是一个简单的代码片段,它应该符合要求:
import multiprocessing
import time
POOL_SIZE = 4
STEP = 1
def sleep(seconds: int):
time.sleep(seconds)
def main():
tasks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pool = [None] * POOL_SIZE
while tasks or [item for item in pool if item is not None]:
for i in range(len(pool)):
if pool[i] is not None and not pool[i].is_alive():
# Finished task. Clear the resource.
pool[i] = None
if pool[i] is None:
# Free resource. Start new task if any are left.
if tasks:
task = tasks.pop(0)
pool[i] = multiprocessing.Process(target=sleep, args=(task,))
pool[i].start()
time.sleep(STEP)
if __name__ == '__main__':
main()
管理器有一个任意长度的tasks
列表,为了简单起见,这里的任务由整数表示,整数作为sleep
函数的参数。它还有一个池
列表,最初为空,表示可用资源
经理定期访问所有当前正在运行的流程,并检查它们是否已完成。如果资源可用,它还会启动新进程。整个循环都在重复,直到没有任务和当前正在运行的进程。步骤
值用于节省计算能力-通常不需要每隔毫秒检查一次正在运行的进程
至于注意事项,在使用多处理时应牢记这一点。据我所知,您的
main
将变成:
def main():
tasks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
with multiprocessing.Pool(POOL_SIZE) as pool:
pool.map(sleep, tasks)
i、 e.您刚刚重新实现了一个池,但效率低下(
pool
在可能的情况下重用Process
es),而且在不太安全的情况下,pool
花费了大量精力来清理异常您可以使用multiprocessing.pool
为什么不使用建议的pool().map
API?@SamMason我刚刚开始学习多处理
模块和所有那些管道
,队列
,事件
,屏障
,信号灯
,管理器
。。。课程对我来说还是有点太难理解了。我设法从头开始实现该功能,但我仍然对是否(以及如何)使用多处理类实现该功能感兴趣。这就是为什么我贴出这个问题。好吧,那太尴尬了。并行编程是思维上的一大步——你的代码简直太简单了,我仍然很难想象在这一两行代码后面到底发生了什么。尽管如此,它还是帮了我很多忙,谢谢。@Jeyekomon开源代码的乐趣在于,只要你愿意,它就在那里:)