gpt4 book ai didi

Python线程运行()阻塞

转载 作者:行者123 更新时间:2023-11-28 22:17:20 28 4
gpt4 key购买 nike

当我创建以下内容时,我试图创建一个可以被异常终止的线程类(因为我试图让线程等待一个事件):

import sys

class testThread(threading.Thread):
def __init__(self):
super(testThread,self).__init__()
self.daemon = True

def run(self):
try:
print('Running')
while 1:
pass
except:
print('Being forced to exit')

test1 = testThread()
test2 = testThread()

print(test1.daemon)
test1.run()
test2.run()

sys.exit()

但是,运行程序只会打印出一条Running消息,直到另一条终止。这是为什么?

最佳答案

问题是您正在调用 run方法。

这只是您实现的一个普通的旧方法,它会执行您放入其主体中的任何操作。在这种情况下,正文是一个无限循环,因此调用 run 只会永远循环下去。

启动线程的方式是start方法。此方法是 Thread 类的一部分,它的作用是:

Start the thread’s activity.

It must be called at most once per thread object. It arranges for the object’s run() method to be invoked in a separate thread of control.

因此,如果您调用它,它将启动一个新线程,使该新线程运行您的 run() 方法,并立即返回,因此主线程可以继续做其他事情。< sup>1 这就是你想要的。


<子>1。正如让-弗朗索瓦·法 bool (Jean-François Fabre) 所指出的,您仍然不会在这里获得任何真正的并行性。繁忙循环在多线程代码中从来都不是一个好主意,如果你在 CPython 或 PyPy 中运行它,几乎所有的繁忙循环都是在执行 Python 字节码的同时持有 GIL,并且一次只有一个线程可以持有 GIL。因此,从粗略的角度来看,事情看起来是并发的——三个线程在运行,并且都在取得进展。但如果放大,两个线程同时进行的地方几乎没有重叠,通常甚至不足以弥补较小的调度程序开销。

关于Python线程运行()阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51493839/

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