python-如何强制执行其他线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-如何强制执行其他线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1341字,纯文字阅读大概需要2分钟。
内容图文
![python-如何强制执行其他线程](/upload/InfoBanner/zyjiaocheng/652/cefc50dc6e714015bf944f52852dd13a.jpg)
我有一个主线程执行一些CPU密集型操作.线程必须为其所有计算持有一个锁.
然后还有其他一些线程有时需要短暂时间使用相同的锁.
如果没有其他线程,如何强制主线程偶尔允许其他线程执行而不降低其执行速度?
定期的
lock.release()
time.sleep(x)
lock.acquire()
因为某些x会将控制权传递给另一个线程,但是如果没有其他线程,则减慢主线程的速度.
另一方面,如果没有sleep()调用,GIL似乎会在这里干扰.由于主线程在执行release()时具有GIL,因此另一个线程显然不能立即从acquire()返回.因此,除非GIL开关恰好与我释放自己的锁相吻合,否则主线程将继续使用其自己的Acquisition()方法,而其他线程则永远不会获得该锁.
这个问题的正确解决方案是什么?有没有办法强制释放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)和select()有时出于相同的目的使用,尽管根据系统调度程序,它并不总是相同的. Windows,您需要睡眠(0).都使用time.sleep(0).
内容总结
以上是互联网集市为您收集整理的python-如何强制执行其他线程全部内容,希望文章能够帮你解决python-如何强制执行其他线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。