PyPy和Python线程?

4
我有一个使用了一些线程的python应用程序,使用的是kivy框架。由于全局解释器锁定,python无法在不同的核心上运行这些线程。我想尝试使用PyPy,看看能否让线程在不同的核心上运行得更快,因为PyPy是不同的,并提供了stackless(不管是什么?:)。

是否有人可以分享如何使一个简单的python程序通过模块threading启动一些线程,并使用pypy解释器以使用这个stackless特性的信息?


@noɥʇʎԀʎzɐɹƆ:那个赏金描述太过宽泛了。请不要使用赏金来劫持其他问题并扩大其范围。 - Martijn Pieters
无栈线程是一种类似于绿色线程的线程,它们不支持SMP。它们更像是解释器拥有自己的调度程序,并由其自己调度这些线程。但从操作系统的角度来看,这仍然是一个进程。要利用SMP,您需要使用多处理或诉诸于使用C或Cython等本机线程。 - geckos
1个回答

4
Pypy无法解决每次运行单个线程的Python问题,因为它也使用GIL - http://doc.pypy.org/en/latest/faq.html#does-pypy-have-a-gil-why 此外,Kivy是一个嵌入Python本身的复杂项目 - 尽管我不太了解它,但我怀疑在其中切换Python以供Pypy使用可能是不可能的。
根据您正在做什么,您可能希望使用multiprocessing模块而不是threading - 它是一个可透明地进行进程间调用Python函数的插件替换,因此可以利用多个核心。https://docs.python.org/3/library/multiprocessing.html 这在cPython中是标准的,并且很可能可以从Kivy内部使用,如果(并且仅当)子进程中的所有代码都只处理数字计算等任务,并且所有用户交互和显示更新都在主进程中进行。

2
是的,我目前正在尝试使用多进程工具进行实现,但有点糟糕,因为转向通信意味着我需要传递很多之前共享内存的东西 =),在这方面,Python真的很糟糕,而且我最近才听说了GIL。 - Gabriel
2
使用共享内存来与线程通信最终会让你后悔...使用队列吧。Python的队列对象非常好用。 - Erik Aronesty
我同意,当涉及共享内存并行化时,Python 的表现确实不太好,但我还是喜欢 Python。你可以使用 Cython 或 C 与 pthreads 来实现,并仍然具有 Python 接口。 - geckos

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