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

溫馨提示×

溫馨提示×

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

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

python中暫停代碼的方法是什么

發布時間:2021-07-23 09:45:42 來源:億速云 閱讀:2547 作者:chen 欄目:編程語言

本篇內容主要講解“python中暫停代碼的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python中暫停代碼的方法是什么”吧!

我們知道,在 Python 里面可以使用time.sleep來讓代碼暫停一段時間,例如:

import time  print('...部分代碼...') time.sleep(5) print('...剩下的代碼...')

程序首先打印出...部分代碼...,然后等待5秒鐘,再打印出...剩下的代碼...。

現在大家想一想,有沒有什么辦法,在不使用time.sleep的情況下,讓程序暫停5秒?

你可能會說,用requests訪問一個延遲5秒的網址、或者用遞歸版算法計算斐波那契數列第36位……這些奇技淫巧。

不過今天我說的,是另外一個東西,threading模塊里面的Event。

我們來看看它的用法:

import threading  event = threading.Event() print('...部分代碼...') event.wait(5) print('...剩下的代碼...')

這樣一來,程序首先打印出...部分代碼...,然后等待5秒鐘,再打印出...剩下的代碼...。

功能看起來跟time.sleep沒什么區別,那為什么我要特別提到它呢?因為在多線程里面,它比time.sleep更有用。我們來看一個例子:

import threading  class Checker(threading.Thread):     def __init__(self, event):         super().__init__()         self.event = event      def run(self):         while not self.event.is_set():             print('檢查 redis 是否有數據')             time.sleep(60)  trigger_async_task() event = threading.Event() checker = Checker(event) checker.start() if user_cancel_task():     event.set()

我來解釋一下這段代碼的意思。在主線程里面,我調用trigger_async_task()觸發了一個異步任務。這個任務多久完成我并不清楚。但是這個任務完成以后,它會往  Redis 里面發送一條消息,只要 Redis 有這個消息了,我就知道它完成了。所以我要創建一個 checker 子線程,每60秒去  Redis里面檢查任務是否完成。如果沒有完成,就暫停60秒,然后再檢查。

但某些情況下,我不需要等待了,例如用戶主動取消了任務。這個時候,我就想提前結束這個 checker 子線程。

但是我們知道,線程是不能從外面主動殺死的,只能讓它自己退出。所以當我執行event.set()后,子線程里面self.event.is_set()就會返回  False,于是這個循環就不會繼續執行了。

可是,如果某一輪循環剛剛開始,我在主線程里面調用了event.set()。此時,子線程還在time.sleep中,那么子線程需要等待60秒才會退出。

但如果我修改一下代碼,使用self.event.wait(60):

import threading  class Checker(threading.Thread):     def __init__(self, event):         super().__init__()         self.event = event      def run(self):         while not self.event.is_set():             print('檢查 redis 是否有數據')             self.event.wait(60)  trigger_task() event = threading.Event() checker = Checker(event) checker.start() if user_cancel_task():     event.set()

那么,即便self.event.wait(60)剛剛開始阻塞,只要我在主線程中執行了event.set(),子線程里面的阻塞立刻就會結束。于是子線程立刻就會結束。不需要再白白等待60秒。

并且,event.wait()這個函數在底層是使用 C 語言實現的,不受 GIL 鎖的干擾。

到此,相信大家對“python中暫停代碼的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

修武县| 石狮市| 天等县| 五原县| 淳安县| 尚义县| 祁阳县| 琼海市| 旅游| 榆中县| 长丰县| 新晃| 孟州市| 黔西| 贵港市| 高平市| 斗六市| 南溪县| 怀来县| 长沙市| 白河县| 平乡县| 霞浦县| 连山| 本溪市| 建德市| 镶黄旗| 信丰县| 文山县| 雷山县| 淳安县| 云梦县| 鞍山市| 柘城县| 朝阳区| 温宿县| 安宁市| 章丘市| 长子县| 泌阳县| 义马市|