创建多个进程并使这些进程创建线程有多糟糕。我的任务是I / O和cpu绑定?
答案 0 :(得分:0)
这实际上取决于您的工作量的具体情况。要在Python中并行化CPU绑定工作,您绝对应该使用multiprocessing
模块。通常,您应该使用与CPU内核一样多的进程。如果你使用的不止于此,你最终会损害性能,因为你的操作系统必须进行更多的上下文切换,以便为每个进程提供CPU时间。
通过添加I / O绑定工作,事情变得复杂了。通常,在Python中处理threading
的I / O绑定工作是可以的,因为GIL将在阻塞I / O调用时发布。但是,重要的是要记住,该线程中发生的所有其他内容都需要GIL - 一旦I / O操作完成,就从运行它的C代码将其重新激活到Python中,传递该数据在某个地方进行处理,循环回来再次进行阻塞I / O调用等等。所有这些都需要GIL。因此,即使对于I / O绑定操作,使用线程也存在与GIL相关的性能成本。如果从套接字读取的I / O绑定线程经常获取数据,他们最终需要获取相当多的GIL,这可能会对性能产生显着影响。如果你的I / O绑定线程大部分时间都在阻塞,它将花费大部分时间没有GIL,并且可能不会对性能产生明显的影响。
所以TL; DR-你可以做你正在描述的事情,或者可能没有。它的非常取决于您的工作量的具体情况。实际上,您最好的选择是尝试一下,看看性能如何,然后调整您正在运行和比较的进程/线程的数量。