用于阻塞api的基于twisted线程池的包装器。

thimble的Python项目详细描述


https://travis-ci.org/lvh/thimble.svghttps://coveralls.io/repos/lvh/thimble/badge.pnghttps://dl.dropboxusercontent.com/u/38476311/Logos/thimble.jpg

顶针是安全使用针和线的工具。这个 顶针库用 通过线程池实现的非阻塞、扭曲友好的延迟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,或始终 返回相同的顶针。

更改日志

顶针使用SemVer

v0.2.0

  • 对TOX CI设置的小更新
  • 升级的依赖项

v0.1.1

  • 添加了此更改日志
  • 拼写修复
  • 添加了.gitignore
  • 大量文档改进

v0.1.0

首次公开发行。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
选项卡内的java 安卓工具栏   java接口VS API VS公共类   无法解析java。lang.ClassNotFoundException:在安卓 studio中找不到类“com.example.安卓.camera2basic.AutoFitTextureView”?   java等待线程正常完成   java在JTable中的prepareRenderer方法中编辑单元格数据是否可行?   java SessionNotCreatedException selenium webdriver   java Android Studio Gradle CreateProcess错误=2   java找不到适用于异常(int)的构造函数   javascript如何在不使用正则表达式的情况下检查输入是否为表情符号?   从JAVA运行ant时,JAVA_HOME变量不正确   long的java min值引发异常   java如何在这段代码中实现侦听器?   带有透明文本的java Android按钮   图像Java扫描仪问题(JFrame)   java模拟输入蒸汽似乎在Junit测试的第一次输入中就被吃掉了   压缩Java Deflater,现在和将来的结果相同(确定性)   java JTable getModel()。setValueAt从数组中删除第一个元素   java我有不同于编译器和计算器的价值   使用C#客户端调用基本身份验证java webservice   java相同类型的多个@Embedded字段在持久化后始终为空