當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python distributed.Semaphore用法及代碼示例


用法:

class distributed.Semaphore(max_leases=1, name=None, register=True, scheduler_rpc=None, loop=None)

semaphore 將跟蹤調度程序上的租約,這些租約可由此類的實例獲取和釋放。如果已經獲得了最大數量的租約,則無法獲得更多租約,調用者將等待直到另一個租約被釋放。

使用超時來控製生命周期或租約。此超時由此實例的Client 定期刷新,並在工作人員失敗的情況下提供防止死鎖或資源不足的保護。可以使用配置選項 distributed.scheduler.locks.lease-timeout 控製超時,並且使用選項 distributed.scheduler.locks.lease-validation-interval 設置調度程序驗證超時的時間間隔。

與 python 標準庫的 Semaphore 的一個顯著區別是,此實現不允許發布比獲取更多的頻率。如果發生這種情況,會發出警告,但不會修改內部狀態。

警告

此實現仍處於實驗狀態,並且在此庫的主要版本沒有任何更改的情況下,可能會發生細微的行為變化。

警告

在租約超時的情況下,此實施容易受到租約超額預訂的影響。建議監控日誌信息並將上述配置選項調整為適合用戶應用程序的值。

參數

max_leases: int (optional)

可同時授予的最大租賃數量。這有效地設置了對特定資源的並行訪問量的上限。默認為 1。

name: string (optional)

要獲取的信號量的名稱。選擇相同的名稱允許兩個斷開連接的進程進行協調。如果沒有給出,將生成一個隨機名稱。

register: bool

如果為 True,則向調度程序注冊信號量。這需要在獲得任何租約之前完成。如果在初始化的時候沒有做,也可以通過調用這個類的 register 方法來做。注冊時,需要等待。

scheduler_rpc: ConnectionPool

連接到調度程序的 ConnectionPool。如果提供 None ,它使用工作人員或客戶端池。該參數主要用於測試。

loop: IOLoop

此實例正在使用的事件循環。如果提供了 None,則重用活動工作者或客戶端的循環。

注意

如果客戶端嘗試釋放信號量但沒有獲得租約,這將引發異常。

當信號量關閉時,如果對於該關閉的信號量,客戶端嘗試:

  • 獲取租約:將引發異常。
  • 發布:將記錄警告。
  • 關閉:什麽都不會發生。

dask默認執行函數,假設它們是純的,當在這樣的函數中使用信號量獲取/釋放時,必須注意實際上有side-effects,因此,該函數不再被認為是純的。如果不考慮這一點,可能會導致意外行為。

例子

>>> from distributed import Semaphore
... sem = Semaphore(max_leases=2, name='my_database')
...
... def access_resource(s, sem):
...     # This automatically acquires a lease from the semaphore (if available) which will be
...     # released when leaving the context manager.
...     with sem:
...         pass
...
... futures = client.map(access_resource, range(10), sem=sem)
... client.gather(futures)
... # Once done, close the semaphore to clean up the state on scheduler side.
... sem.close()

相關用法


注:本文由純淨天空篩選整理自dask.org大神的英文原創作品 distributed.Semaphore。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。