当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。