python中start和run方法有什么区别
今天小编给大家分享一下python中start和run方法有什么区别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
结论:启动线程,如果对target进行赋值,并且没有重写run方法,则线程start的时候会直接调用target中对应的方法
具体代码如下:
1、初始化一个线程
threading.Thread.__init__(self,target=thread_run())def__init__(self,group=None,target=None,name=None,args=(),kwargs=None,*,daemon=None):assertgroupisNone,"groupargumentmustbeNonefornow"ifkwargsisNone:kwargs={}self._target=targetself._name=str(nameor_newname())self._args=argsself._kwargs=kwargs
2、调用start启动线程
最终调用_start_new_thread方法,self._bootstrap作为传参
thread1.start()defstart(self):ifnotself._initialized:raiseRuntimeError("thread.__init__()notcalled")ifself._started.is_set():raiseRuntimeError("threadscanonlybestartedonce")with_active_limbo_lock:_limbo[self]=selftry:_start_new_thread(self._bootstrap,())exceptException:with_active_limbo_lock:del_limbo[self]raiseself._started.wait()
3、_start_new_thread等同于启动一个新线程,并在新线程中调用回调函数
_start_new_thread=_thread.start_new_threaddefstart_new_thread(function:Callable[...,Any],args:tuple[Any,...],kwargs:dict[str,Any]=...)->int:...
4、执行的回调函数就是上文传入的self._bootstrap, _bootstrap方法直接调用_bootstrap_inner(),而bootstrap_inner则调用run方法
def_bootstrap_inner(self):try:self._set_ident()self._set_tstate_lock()if_HAVE_THREAD_NATIVE_ID:self._set_native_id()self._started.set()with_active_limbo_lock:_active[self._ident]=selfdel_limbo[self]if_trace_hook:_sys.settrace(_trace_hook)if_profile_hook:_sys.setprofile(_profile_hook)try:self.run()
5、最终调用run方法
defrun(self):try:ifself._target:self._target(*self._args,**self._kwargs)finally:#Avoidarefcycleifthethreadisrunningafunctionwith#anargumentthathasamemberthatpointstothethread.delself._target,self._args,self._kwargs
结论:
如果run方法被重写,则直接调用重写的run方法
如果run方法没有被重写,并且target被定义,则会直接调用线程创建时候的target方法,否则什么也不做
此处遇到一问题:
指定target参数,在执行过程中,打印的进程名mainthread(主进程),而不是之前所赋的进程名
threading.Thread.init(self,target=thread_run())
分析后发现赋予target的是执行的函数体,因此会先执行thread_run函数,执行结束后,将thread_run的返回值赋给了target,因为thread_run没有返回值,因此target的值是None,如果此时没有重写run函数,那么线程什么都不会做。 thread_run的执行是在主线程,而不是我们所认为的在子线程中执行thread_run
defthread_run():print("overwrite:开始线程:"+threading.current_thread().name)time.sleep(2)print("overwrite:退出线程:"+threading.current_thread().name)classmyThread(threading.Thread):def__init__(self,threadID,name,delay):threading.Thread.__init__(self,target=thread_run())self.threadID=threadIDself.name=nameself.delay=delaythread1.start()thread1.join()print("退出主线程")
运行结果:
overwrite: 开始线程:MainThread
overwrite: 退出线程:MainThread
退出主线程
以上就是“python中start和run方法有什么区别”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。