Python 如何避免线程间的全局锁 GIL 进行并行计算?

2020-10-06 10:20:56 +08:00
 threebr

我现在有一个串行的代码,长这样:

for t in range(100000):
    A(t+1) = fun_A(B(t))
    B(t+1) = fun_B(A(t))

fun_A(), fun_B() 是我自己写的两个函数,分别需要上一个循环中对方的输出作为输入。

现在有没有办法将 fun_A(), fun_B() 在一个循环内并行执行?用多线程的话因为 CPython 存在全局锁可能实际上是串行执行,多进程的话不知道会不会额外增加两个函数间的数据传递的 I/O 开销。

各位有没有什么其他实现的思路?

2480 次点击
所在节点    问与答
23 条回复
threebr
2020-10-07 10:07:38 +08:00
@sunhk25 我还没有开始实践,只是网上的说法如此,线程比进程更轻量,切换线程的上下文开销和线程间数据同步的开销都比进程小
huskar
2020-10-07 13:06:23 +08:00
@black11black 我是说楼主这需求跟 gil 没关系。比如用 c,没有 gil,该怎么写?
black11black
2020-10-07 21:41:14 +08:00
@threebr 理论上线程也需要进行内核态切换,不像协程局限在用户态内,所以 asyncio 的出现极大地拓展了 py 的 IO 相关处理能力,和进程有多大差距应该是在内存部分,具体的没了解到非常详细的部分。但是线程切换是有切片时间的,比如一种情况是比如你计划在一秒内转换一万次线程,这种密度上使用多线程会导致效率降低很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/712727

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX