moe*_*nad 3 python deadlock process
我有3个线程,当前正在同时运行。
def f1():
print "running first thread\n"
sleep(10)
def f2():
print "running second thread\n"
sleep(10)
def f3():
print "running third thread\n"
sleep(10)
if __name__ == "__main__":
thread1 = Thread(target = f1)
thread2 = Thread(target = f2)
thread3 = Thread(target = f3)
try:
thread1 = Thread(target = f1)
thread1.start()
thread2 = Thread(target = f2)
thread2.start()
thread3 = Thread(target = f3)
thread3.start()
while(thread1.isAlive() or thread2.isAlive() or thread3.isAlive()):
thread1.join()
thread2.join()
thread3.join()
except (KeyboardInterrupt, SystemExit):
sys.exit()
Run Code Online (Sandbox Code Playgroud)
如何模拟死锁?另外,如何让每个线程都互相运行?还可以列出脚本中当前正在运行的所有线程吗?还是给他们优先级?
如何模拟死锁?
所有的死锁意味着一个或多个线程被阻止进行任何进度,因此您可以使用单个线程对其进行仿真。只是把while True:周围sleep(10)。
在实际情况下,通常会有两个线程同时阻止彼此进行进度。例如,也许他们以相反的顺序使用了一对锁,所以线程1在获得锁2之前不会释放锁1,但是线程2在获得锁1之前不会释放锁2。最好通过使两个线程永久阻塞来模拟它。
如果你想真正创建一个僵局,最简单的方法是让线程相互字面上块:添加thread2.join()到f1,并thread1.join()到f2。然后f1无法完成,直到f2确实,f2无法完成,直到f1做,所以没有人能完成。
但是,如果要创建现实的死锁,几乎可以肯定,您将想要使用同步对象threading.Lock来完成上述的两锁方案。
另外,如何让每个线程都互相运行?
好吧,最简单的方法就是首先不要使用线程。但是,如果您确实想要,请执行以下操作:
thread1.start()
thread1.join()
thread2.start()
thread2.join()
thread3.start()
thread3.join()
Run Code Online (Sandbox Code Playgroud)
还可以列出脚本中当前正在运行的所有线程吗?
参见threading.enumerate()。除了调试目的,您通常不希望使用它。如果要以后再访问它们(在执行操作时),请在创建线程时跟踪它们。
还是给他们优先级?
正如文档所说:
当前,没有优先级,没有线程组,并且无法破坏,停止,挂起,恢复或中断线程。
如果你想要这个,你必须步骤外threading和,例如,通过使用原生API ctypes,win32api等等。
| 归档时间: |
|
| 查看次数: |
3377 次 |
| 最近记录: |