91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中start和run方法有什么區別

發布時間:2022-02-14 09:38:27 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

今天小編給大家分享一下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):
        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作為傳參

thread1.start()
    def start(self):
        if not self._initialized:
            raise RuntimeError("thread.__init__() not called")
        if self._started.is_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._started.wait()

3、_start_new_thread等同于啟動一個新線程,并在新線程中調用回調函數

_start_new_thread = _thread.start_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則調用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] = self
            del _limbo[self]

        if _trace_hook:
            _sys.settrace(_trace_hook)
        if _profile_hook:
            _sys.setprofile(_profile_hook)
        try:
            self.run()

5、最終調用run方法

 def run(self):
        try:
            if self._target:
                self._target(*self._args, **self._kwargs)
        finally:
            # Avoid a refcycle if the thread is running a function with
            # an argument that has a member that points to the thread.
            del self._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

def thread_run():
    print ("overwrite: 開始線程:" + threading.current_thread().name)
    time.sleep(2)
    print ("overwrite: 退出線程:" + threading.current_thread().name)

class myThread (threading.Thread):
    def __init__(self, threadID, name, delay):
        threading.Thread.__init__(self,target=thread_run())
        self.threadID = threadID
        self.name = name
        self.delay = delay
        thread1.start()

thread1.join()
print ("退出主線程")

運行結果:

overwrite: 開始線程:MainThread
overwrite: 退出線程:MainThread
退出主線程

以上就是“python中start和run方法有什么區別”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

星子县| 惠东县| 蓬溪县| 垫江县| 阜康市| 丰镇市| 华安县| 靖宇县| 昔阳县| 类乌齐县| 泾源县| 玉树县| 中西区| 大方县| 桐城市| 依安县| 桃园县| 宁陵县| 维西| 芦溪县| 普格县| 吉林省| 钟祥市| 景泰县| 金秀| 淮安市| 邵阳县| 延川县| 高淳县| 顺昌县| 英山县| 广元市| 雷州市| 梅州市| 奎屯市| 贵州省| 陆良县| 湘阴县| 东乌珠穆沁旗| 台南市| 平顶山市|