gpt4 book ai didi

python - 如何强制执行不同的线程

转载 作者:行者123 更新时间:2023-11-28 16:53:39 24 4
gpt4 key购买 nike

我有一个主线程执行一些 CPU 密集型操作。线程必须为其所有计算持有锁。

还有一些其他线程偶尔会在短时间内需要相同的锁。

如果没有其他线程,我如何强制主线程偶尔允许其他线程执行而不减慢它的速度?

周期性

lock.release()
time.sleep(x)
lock.acquire()

对于某些 x 会将控制权传递给另一个线程,但如果没有其他线程,则会减慢主线程的速度。

另一方面,如果没有 sleep() 调用,GIL 似乎会干扰此处。由于主线程在执行 release() 时有 GIL,另一个线程显然无法立即从 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 标准库中没有该函数的接口(interface);添加一个带有 native 模块的模块会很简单。

usleep(0)select() 有时用于相同的目的,但根据系统调度程序的不同,它们并不总是相同的。 Windows,你想要 sleep (0)。对这两个都使用 time.sleep(0)。

关于python - 如何强制执行不同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3795119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com