python - 我可以使用 C 模块绕过 python GIL 吗?

标签 python c api

我想用 python 做一些实验。 我想介绍一些功能,例如 javascript 的 setTimeout 或 setInterval,移植某种异步行为,而无需大量阻塞调用来启动事件循环。

让我们看看这个例子(当然现在不起作用):

from mymod import set_timeout # of course we love the PEP8 :)
import sys, time

def say_finished():
    time.sleep(2) # waiting, suppose here to have some blocking behaviour
    sys.stdout.write("\nSee you!")

sys.stdout.write("Hello, ")
set_timeout(say_finished, 2000) # supposing we have msec granularity
sys.stdout.write("World!")

我想要像 javascript 那样的行为。如果 set_timeout 由于 GIL 而启动一个新线程,它仍然会打印“Hello,\nSee you!World”,因为新线程会阻塞主线程,直到它完成为止。

如果 set_timeout 在 C 代码中使用 posix 线程,我是否能够绕过此行为? 这将是与 Python C/API 的集成,我不知道是否可以绕过 GIL,或者 API 本身是否也被迫被 GIL 阻止(我会尝试,但现在我正在研究文档,我还没有准备好亲自尝试)。

这应该是: print "Hello,"-> 运行 set_timeout (必须返回以让解释器继续执行程序) -> print "World!"-> 在外部线程运行时保持事件状态 -> 回调“say_finished” -> 结束。

让我认为需要编辑解释器本身的是“在外部线程运行时保持事件状态”的部分。

我不想使用进程,因为新进程会产生开销。

请不要说“那么就使用 Javascript”,因为我喜欢 Python 语法,并且我想使用这种方法。

最佳答案

我认为您对 GIL 感到困惑。它只是 VM 的一个实现细节,通过定期在所有运行的线程之间交换来确保代码是线程安全的。每个虚拟机都需要某种方法来确保线程安全,虽然 GIL 不一定是最快或最好的实现,但应用程序程序员并不需要担心。

您可以使用threading模块在多个线程中运行代码,或者如果您确实想要“适当的”并行性,请使用multiprocessing模块,该模块将在分离操作系统进程并“绕过 GIL”,这是值得的。如果您想要特定的异步功能,可以使用一个新的 futures 模块来提供此类功能。如果您确实需要 sleep 一段时间,只需调用time.sleep即可。

无论哪种方式,坚持一些高层次的东西,因此,比尝试执行自己的应用程序特定的计时和调度更不容易出错,这不是一个简单的问题需要解决!

关于python - 我可以使用 C 模块绕过 python GIL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9351328/

相关文章:

java - Android Retrofit : missing method body, 或声明抽象

c# - 如何在 ASP.Net 中设计公共(public) API?

c - 在不违反标准的情况下使用指向结构的指针对数组进行别名

c - 双循环的 kbhit() 不能很好地工作

c - 如何解决 'undefined reference to pow'(已与 -lm 链接)?

api - 检索推特对话

python - 使用 Paramiko 执行的命令不会产生任何输出

python - 在 python 中的嵌套字典中添加值

python - argparse:展平操作结果 ='append'

python - 如何将实时视频分割成图像?