用于阻塞api的基于twisted线程池的包装器。
thimble的Python项目详细描述
顶针是安全使用针和线的工具。这个 顶针库用 通过线程池实现的非阻塞、扭曲友好的延迟api。
快速启动
您感兴趣的主要对象是thimble.Thimble。它需要一个 线程池、阻塞对象和方法名列表 希望遵从线程池。
下面是我们的阻塞对象示例:
>>> class Car(object): ... wheels = 4 ... def drive_to(self, location): ... # Assume the real implementation blocks. ... return "driven to {0}".format(location) >>> car = Car()
出于演示的目的,我们将对线程使用测试双精度 pool和reactor;在实际代码中,您需要使用真实的东西。
>>> from thimble.test.util import FakeThreadPool, FakeReactor >>> pool = FakeThreadPool() >>> reactor = FakeReactor()
游泳池还没开始。(我们将在 分钟。)
>>> pool.started False
创建Thimble:
>>> from thimble import Thimble >>> car_thimble = Thimble(reactor, pool, car, ["drive_to"])
当访问列表中名为的方法时,将得到一个对象包装 相反。调用它将返回延迟的。传递的任何参数都是 逐字传递给包装的方法。
>>> def print_(s): ... # can't use from __future__ import print_function because of a ... # doctest limitation :-( ... print s
>>> d = car_thimble.drive_to("work").addCallback(print_) driven to work
此延迟已同步启动,因为我们正在使用 假线程池和reactor。
您可以直接在 Thimble:
>>> car.wheels 4
如果传递给Thimble的线程池尚未启动 然而,当它第一次尝试使用它时,Thimble将启动它并 安排关机时间。如果您传递的线程池已经 一开始,你就要对它的关闭负责。在这种情况下, 线程池尚未启动,因此Thimble已为您启动:
>>> pool.started True
关闭reactor,reactor将要求线程池 在自动关闭之前立即停止。
>>> reactor.stop() >>> pool.started False
在代码中使用顶针
线程池
您可以选择使用reactor线程池,或者创建自己的线程池 线程池。
使用reactor线程池可能是个坏主意。反应堆 默认情况下,线程池在许多软件之间共享,并且 也用于DNS解析。如果你的软件阻止了 池中的可用线程(可能是偶然的,也可能是由于 会影响dns解析,进而影响许多其他 系统;如果它不直接影响那些系统(因为它们, 也希望使用reactor线程池)。
它可能是最可靠的有一个专用的线程池 申请,有两个原因:
- 应用程序可能最清楚什么是好的大小 线程池。
- 它是一个合适的状态来表示全局状态:如果您要 把它放在一个图书馆,不同的图书馆用户在同一个 过程最终会互相绊倒。
不幸的是,共享的全局状态几乎就是您的工作方式:
from twisted.python.threadpool import ThreadPool _the_thread_pool = _ThreadPool()
有关更多详细信息,请参阅threadpool类的文档;它 允许您指定最小和最大线程数。这个 默认值可能相当合理。
并发性和线程安全性
指定线程池的线程数是 可以尝试同时访问对象的线程数。 由你来确定这个对象是线程安全的。
如果您想为 不是线程安全的,您可以限制 线程池为1,导致完全同步访问。记住 对不在 blocking_methods列表仍将由 正在调用线程。
入口点
虽然子类化Thimble可能意外地工作,但它不是 推荐。我保留以某种方式更改实施的权利 这可能会打破这一点:例如,通过引入一个元类。
最好编写一个小的实用函数 构造使用共享线程池的新Thimble,或始终 返回相同的顶针。