Python多线程在IO密集型任务中的应用

3
建议仅在IO限制的任务中使用Python多线程,因为Python有全局解释器锁(GIL),只允许一个线程控制Python解释器。然而,多线程对于IO限制操作有意义吗?指出,一般来说,在磁盘IO限制的任务中,只有当您访问多个磁盘时,使用多线程才有意义,鉴于瓶颈是磁盘。
鉴于此,如果我有几个同时访问单个本地磁盘中数据库的任务,是否使用多线程会有任何优势,因为瓶颈将是磁盘?
如果数据库存储在单个远程磁盘中,答案是否改变?我想可能是,因为还有另一个可能成为瓶颈的变量:我和服务器之间的往返时间。
1个回答

3

CPython和Pypy在线程CPU绑定任务方面存在问题,而其他语言如Jython和IronPython则没有这个问题。

有时对于I/O绑定任务使用多线程或多进程是有意义的,因为磁盘查找对于CPU来说很漫长,所以如果你可以在等待磁盘响应时完成一些CPU工作,那么就已经做了一件好事。

如果你编写代码以具有可调节的并发性,你可以通过实验推导出适合你的工作量的好数量。

如果你编写的代码使用新的concurrent.futures API,那么你可以(大多数情况下)轻松地使用类似以下方式切换线程和进程:

  • concurrent.futures.ThreadPoolExecutor
  • concurrent.futures.ProcessPoolExecutor

此API在CPython 3.2及以上版本以及Tauthon 2.8中可用。

这里是一个示例程序:http://stromberg.dnsalias.org/~strombrg/coordinate/

希望对你有所帮助。


  1. 鉴于Python中使用线程并行化CPU绑定任务的问题是由GIL引起的,Jython和IronPython如何避免这种情况?
  2. 如果磁盘寻道时间远大于任务处理时间(即它是一个IO绑定任务),并且只有一个本地磁盘,那么我认为添加几个线程以便“将一些CPU工作完成”所获得的收益微不足道。这不是正确的吗?
- Alan Evangelista
2
Jython和IronPython没有GIL。它们继承自底层运行时(例如JRE)的内存管理,这些运行时不是基于GIL的。 - Tim Richardson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接