我有一个主线程执行一些 CPU 密集型操作。线程必须为其所有计算持有锁。
还有一些其他线程偶尔需要在短时间内使用相同的锁。
如果没有其他线程,如何强制主线程偶尔允许其他线程执行而不减慢速度?
周期性的
lock.release()
time.sleep(x)
lock.acquire()
对于某些 x 会将控制权传递给另一个线程,但如果没有其他线程,则会减慢主线程的速度。
另一方面,如果没有sleep()
调用 GIL 似乎会干扰这里。由于主线程执行时有GILrelease()
,另一个线程显然无法从acquire()
立即地。因此,主线程继续执行自己的操作acquire()
方法和其他线程永远不会获得锁,除非 GIL 开关恰好与我释放自己的锁同时发生。
这个问题的正确解决方案是什么?有没有办法强制释放 GIL?基本上我想要一些神奇的代码来确保在下面的测试脚本中第二个线程总是首先获得锁:
import threading
import time
class t1 (threading.Thread):
def run(self):
print "Second thread waiting for lock"
lock.acquire()
print "Second thread got lock"
lock.release()
lock = threading.Lock()
lock.acquire()
t = t1()
t.start()
time.sleep(1)
lock.release()
time.sleep(0) # this works very often, but not all the time
lock.acquire()
print "Main thread got lock"
lock.release()
仅仅释放 GIL 并不能保证其他线程有机会运行。
在 Unix 中,你真正想要的调用是sched_yield()
。 Python 标准库中没有该函数的接口;添加一个带有本机模块的模块会很简单。
usleep(0)
and select()
有时用于相同的目的,尽管根据系统调度程序的不同,它并不总是相同的。 Windows,您需要睡眠(0)。对这两者都使用 time.sleep(0) 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)