【发布时间】:2014-08-07 07:11:41
【问题描述】:
创建多个进程并让这些进程创建线程有多糟糕。我的任务是 I/O 和 cpu 绑定的?
【问题讨论】:
标签: multithreading python-2.7 multiprocessing
创建多个进程并让这些进程创建线程有多糟糕。我的任务是 I/O 和 cpu 绑定的?
【问题讨论】:
标签: multithreading python-2.7 multiprocessing
这实际上取决于您工作量的具体情况。为了在 Python 中并行化 CPU 密集型工作,您绝对应该使用 multiprocessing 模块。通常,您应该使用与 CPU 内核一样多的进程。如果您使用更多,最终会损害性能,因为您的操作系统必须进行更多的上下文切换才能为每个进程提供 CPU 时间。
由于添加了 I/O 绑定工作,事情变得有些复杂。通常,在 Python 中使用 threading 处理 I/O 绑定的工作是可以的,因为 GIL 将在阻塞 I/O 调用发生时被释放。但是,重要的是要记住,该线程中发生的所有其他事情都需要 GIL - 一旦 I/O 操作完成,将其从运行它的 C 代码中冒泡回 Python,然后将该数据传递到某个地方以进行处理,循环返回以再次进行阻塞 I/O 调用,等等。所有这些都需要 GIL。因此,使用线程会产生与 GIL 相关的性能成本,即使对于 I/O 绑定操作也是如此。如果从套接字读取的 I/O 绑定线程经常获取数据,那么它们最终将需要获取 GIL 相当多,这可能会对性能产生显着影响。如果您的 I/O 绑定线程大部分时间都在阻塞,那么它将大部分时间都在没有 GIL 的情况下,并且可能不会产生明显的性能影响。
所以 TL;DR- 做你所描述的事情可能很好,也可能不做。这非常取决于您的工作负载的具体情况。确实,您最好的选择是尝试一下,看看性能如何,然后调整您正在运行的进程/线程的数量并进行比较。
【讨论】:
Redis 电话。没有任何异常被提出。这很奇怪!
apply_async 或map_async 调用中?除非您在返回的 AsynResult 对象上调用 get,否则其中发生的异常将静默发生。