|
|
1
53
在最后一个链接中,有一句有趣的话:
pyprocessing PEP 还包括一些有趣的基准测试。 |
|
|
2
36
Python是一种相当容易使用的语言,但是有一些警告。您需要知道的最大的事情是全局解释器锁。这只允许一个线程访问解释器。这意味着两件事:1)在python中很少使用lock语句;2)如果要利用多处理器系统,必须使用单独的进程。编辑:我还应该指出,如果您也想绕过GIL,可以将一些代码放在C/C++中。
如果你想提高响应性,你应该考虑使用线程。不过,还有其他选择,即 microthreading . 您还应该研究一些框架: |
|
3
21
正如您所暗示的,Python线程是通过时间切片实现的。这就是它们获得“平行”效应的方式。
在我的示例中,我的Foo类扩展了线程,然后实现
当然,这只是最基本的。您最终会想了解线程同步和消息传递的信号量、互斥量和锁。 |
|
|
4
12
无论我提到哪里
如果您来自python,则线程在python中的工作方式略有不同
由于python中的内存管理不是线程安全的,因此每个线程都需要独占访问python解释器中的数据结构
以防止多个线程同时访问解释器状态并破坏解释器状态。 其思想是每当执行线程时 (即使是主线) ,获取GIL,并在预定义的时间间隔后
因此,消除GIL的成本是通过降低单线程应用程序的性能来支付的,这是从来都不需要的。
线程切换发生在GIL被释放时。那么什么时候GIL被释放呢? 有两种情况需要考虑。 如果线程正在执行CPU限制的操作(例如图像处理)。
在较旧版本的python中,线程切换通常发生在固定数量的python指令之后
在新版本中,使用可配置的时间间隔,而不是使用指令计数作为切换线程的指标。
如果线程正在执行某些IO绑定操作(例如文件系统访问或
每当线程等待IO操作完成时,就会释放GIL。
解释器没有自己的调度程序。在间隔结束时调度哪个线程是由操作系统决定的。 |
|
|
5
10
IPC python框架或选择其他语言。 |
|
|
6
3
解决GIL的一个简单方法是 multiprocessing 它还可以轻松地扩展到多台物理机器。 如果你真的需要大规模并行化,我会看得更远,但是如果你只是想扩展到一台计算机的所有核心或者几个不同的核心,而不需要所有的工作来实现一个更全面的框架,那么这对你来说就更合适了。 |
|
|
7
2
我甚至建议在处理器上使用多个父处理器,并尝试将类似的作业保留在同一个内核上。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 2 年前 |
|
|
András Takács · Python多线程错误 2 年前 |