2023年11月29日发(作者:)
python中start和run⽅法的区别
结论:启动线程,如果对target进⾏赋值,并且没有重写run⽅法,则线程start的时候会直接调⽤target中对应的⽅法
具体代码如下:
1、初始化⼀个线程
.__init__(self,target=thread_run())
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):
assert group is None, "group argument must be None for now"
if kwargs is None:
kwargs = {}
self._target = target
self._name = str(name or _newname())
self._args = args
self._kwargs = kwargs
2、调⽤start启动线程
最终调⽤_start_new_thread⽅法,self._bootstrap作为传参
()
def start(self):
if not self._initialized:
raise RuntimeError("thread.__init__() not called")
if self.__set():
raise RuntimeError("threads can only be started once")
with _active_limbo_lock:
_limbo[self] = self
try:
_start_new_thread(self._bootstrap, ())
except Exception:
with _active_limbo_lock:
del _limbo[self]
raise
self._()
3、_start_new_thread等同于启动⼀个新线程,并在新线程中调⽤回调函数
_start_new_thread = __new_thread
def start_new_thread(function: Callable[..., Any], args: tuple[Any, ...], kwargs: dict[str, Any] = ...) -> int: ...
4、执⾏的回调函数就是上⽂传⼊的self._bootstrap, _bootstrap⽅法直接调⽤_bootstrap_inner(),⽽bootstrap_inner则调⽤
del self._target, self._args, self._kwargs
结论:
如果run⽅法被重写,则直接调⽤重写的run⽅法
如果run⽅法没有被重写,并且target被定义,则会直接调⽤线程创建时候的target⽅法,否则什么也不做
此处遇到⼀问题:
指定target参数,在执⾏过程中,打印的进程名mainthread(主进程),⽽不是之前所赋的进程名
(self,target=thread_run())
分析后发现赋予target的是执⾏的函数体,因此会先执⾏thread_run函数,执⾏结束后,将thread_run的返回值赋给了target,
因为thread_run没有返回值,因此target的值是None,如果此时没有重写run函数,那么线程什么都不会做。 thread_run的执
⾏是在主线程,⽽不是我们所认为的在⼦线程中执⾏thread_run
def thread_run():
print ("overwrite: 开始线程:" + t_thread().name)
(2)
print ("overwrite: 退出线程:" + t_thread().name)
class myThread ():
def __init__(self, threadID, name, delay):
.__init__(self,target=thread_run())
ID = threadID
= name
= delay
()
()
print ("退出主线程")
运⾏结果:
overwrite: 开始线程:MainThread
overwrite: 退出线程:MainThread
退出主线程
到此这篇关于python中start和run⽅法的区别的⽂章就介绍到这了,更多相关python start和run⽅法内容请搜索以前的⽂章或继
续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!


发布评论