對於 Web 應用中的一些操作,它們可能需要較長時間才能完成,或者它們的執行時間無法確定。對於這些操作,如果使用者只需要知道伺服器已經接收了請求,而不需要立即得到請求的執行結果,那麼我們就可以將它們進行非同步化處理。如果說使用快取是優化網站效能的第一要義,那麼將耗時或執行時間不確定的任務非同步化則是網站效能最佳化的第二要義。簡單來說,能夠延後做的事情都不應該馬上去做。
在上一章節中,我們以傳送簡訊和上傳檔案到雲端儲存為例。這兩個操作中,前者屬於時間不確定的操作(因為作為呼叫者,我們無法確定三方平台回應的時間),後者屬於耗時的操作(如果檔案較大或三方平台不穩定,都可能導致上傳的時間較長)。很顯然,這兩個操作都可以進行非同步化處理。
在 Python 專案中,我們可以使用多執行緒或藉助三方函式庫 Celery 來實現非同步化處理。
Celery 是一個 Python 的非同步任務佇列/訊息佇列,它可以很方便地完成非同步任務的處理。使用 Celery 可以將任務分發到多個任務執行者中,任務執行者可以是單一進程或多個進程、多個主機。 Celery 也支援任務的優先順序、任務結果的保存、任務的重試等功能。
使用Celery 實作非同步化需要以下步驟:
安裝Celery
##在專案中建立一個Celery應用程式pip install celery
from celery import Celery app = Celery('tasks', broker='pyamqp://guest@localhost//')
@app.task def add(x, y): return x + y
result = add.delay(4, 4) print(result.get(timeout=1))
threading 模組可以用來建立多執行緒。使用多執行緒可以將耗時的任務放在新執行緒中執行,不會影響主執行緒的執行。
threading 模組
import threading#定義一個函數作為任務
def task(): print('Hello from task')
t = threading.Thread(target=task) t.start()
schedule、
APScheduler 等。下面以
APScheduler 為例來講解如何實現定時任務。
APScheduler 實作定時任務需要以下步驟:
APScheduler
導入APScheduler
模組<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">from apscheduler.schedulers.blocking import BlockingScheduler</pre><div class="contentsignin">登入後複製</div></div>
建立一個
實例並新增任務<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def task():
print(&#39;Hello from task&#39;)
scheduler = BlockingScheduler()
scheduler.add_job(task, 'interval', seconds=5)
scheduler.start()</pre><div class="contentsignin">登入後複製</div></div>上述程式碼會每隔5 秒執行一次</p>task<p> 函數。 <code>
Celery和多執行緒的比較
Celery的優缺點
、APScheduler
等。這些函式庫都有各自的優缺點,我們可以根據具體需求選擇合適的函式庫來實現定時任務。 schedule函式庫
函數即可實現定時任務。
支援任務的並發執行和負載平衡。
可以方便地整合到 Django、Flask 等 Web 框架中。
以上是如何利用Python的非同步和定時任務來提高程式的並發性和執行效率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!