首頁 > 後端開發 > Python教學 > 如何利用Python的非同步和定時任務來提高程式的並發性和執行效率?

如何利用Python的非同步和定時任務來提高程式的並發性和執行效率?

WBOY
發布: 2023-05-09 17:25:16
轉載
1116 人瀏覽過

非同步任務和定時任務

對於 Web 應用中的一些操作,它們可能需要較長時間才能完成,或者它們的執行時間無法確定。對於這些操作,如果使用者只需要知道伺服器已經接收了請求,而不需要立即得到請求的執行結果,那麼我們就可以將它們進行非同步化處理。如果說使用快取是優化網站效能的第一要義,那麼將耗時或執行時間不確定的任務非同步化則是網站效能最佳化的第二要義。簡單來說,能夠延後做的事情都不應該馬上去做。

在上一章節中,我們以傳送簡訊和上傳檔案到雲端儲存為例。這兩個操作中,前者屬於時間不確定的操作(因為作為呼叫者,我們無法確定三方平台回應的時間),後者屬於耗時的操作(如果檔案較大或三方平台不穩定,都可能導致上傳的時間較長)。很顯然,這兩個操作都可以進行非同步化處理。

在 Python 專案中,我們可以使用多執行緒或藉助三方函式庫 Celery 來實現非同步化處理。

使用Celery實作非同步化

Celery 是一個 Python 的非同步任務佇列/訊息佇列,它可以很方便地完成非同步任務的處理。使用 Celery 可以將任務分發到多個任務執行者中,任務執行者可以是單一進程或多個進程、多個主機。 Celery 也支援任務的優先順序、任務結果的保存、任務的重試等功能。

使用Celery 實作非同步化需要以下步驟:

安裝Celery

pip install celery

##在專案中建立一個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))
登入後複製

使用多執行緒實作非同步化

Python 中的

threading 模組可以用來建立多執行緒。使用多執行緒可以將耗時的任務放在新執行緒中執行,不會影響主執行緒的執行。

使用多執行緒實作非同步化需要以下步驟:

匯入

threading 模組

import threading

#定義一個函數作為任務

def task():
    print('Hello from task')
登入後複製

建立一個新執行緒並啟動它

t = threading.Thread(target=task)
t.start()
登入後複製

定時任務

有些任務需要在特定的時間執行,這時候我們需要使用定時任務。 Python 中有多個第三方函式庫可以用來實現定時任務,如

scheduleAPScheduler 等。下面以 APScheduler 為例來講解如何實現定時任務。

使用

APScheduler 實作定時任務需要以下步驟:

#安裝

APScheduler

##pip install 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>建立一個

BlockingScheduler

實例並新增任務<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">def task(): print(&amp;#39;Hello from task&amp;#39;) scheduler = BlockingScheduler() scheduler.add_job(task, &#39;interval&#39;, seconds=5) scheduler.start()</pre><div class="contentsignin">登入後複製</div></div>上述程式碼會每隔5 秒執行一次</p>task<p> 函數。 <code>Celery和多執行緒的比較

雖然 Celery 和多執行緒都可以實現非同步化處理,但是它們之間存在一些差異和優缺點。

Celery的優缺點

優點:

    #可以將任務分發到多個任務執行者中,從而實現任務的負載平衡,提高任務處理的效率。
  • 支援任務的優先順序、任務結果的保存、任務的重試等功能。
  • 支援多種訊息傳輸協議,如 AMQP、Redis、RabbitMQ 等。
  • 可以方便地整合到 Django、Flask 等 Web 框架中。
  • 缺點:

    安裝和設定過程可能會比較繁瑣。
  • 可能會增加系統的複雜度。
  • 多執行緒的優缺點

#優點:

    #實作起來比較簡單,不需要安裝額外的函式庫。
  • 可以在本機上快速地完成任務處理。
  • 缺點:

    不能將任務分發到多個任務執行者中,因此無法實現任務的負載平衡。
  • 無法方便實現任務的優先順序、任務結果的保存、任務的重試等功能。
  • 可能會導致系統的效能下降,因為多執行緒的並發效能有限。
  • 定時任務的選擇

在Python 中,有多個第三方函式庫可以用來實現定時任務,如

schedule

APScheduler 等。這些函式庫都有各自的優缺點,我們可以根據具體需求選擇合適的函式庫來實現定時任務。 schedule函式庫

    簡單易用,只需要呼叫
  • schedule

    函數即可實現定時任務。

  • 不能實現任務的負載平衡和任務的並發執行。
  • APScheduler函式庫

    支援多種調度器,如 BlockingScheduler、BackgroundScheduler、AsyncIOScheduler 等。
  • 支援多種觸發器,如 date、interval、cron、interval_from_last 等。
  • 支援任務的並發執行和負載平衡。

  • 可以方便地整合到 Django、Flask 等 Web 框架中。

#

以上是如何利用Python的非同步和定時任務來提高程式的並發性和執行效率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板