用于阻塞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如何在ArrayList<List>中选择我的列表中的哪一列用于排序我的ArrayList?   Java设计模式相当于Smalltalk的:   如何在Java中说stringA>stringB   用Python重写Java代码的Python方式   java如何在Mybatis for Postgresql db中使用like(非IN)编写查询?   java看不到如何禁用AlertDialog对话框   java正常转换,但照明仍然很奇怪?   为什么Java中存在检查和未检查异常   使用Flink的JavaSpringBootGradle项目不起作用   java我可以在最终hashmap中存储函数名以供执行吗?   java无法理解实际应用程序中的枚举   java Hibernate注释执行内部连接   java Jenkins Maven3错误,工件已启用   数组的java打印内容只返回[null,null,null,null]   java对同一实体的多个更新   java将日期从一个时区转换为本地时区   jface tableviewer中的java多行功能或换行文本功能   ArrayList是如何在Java中实现的?   如何将程序的输出像矩阵一样写入文件,Java   java EasyMock和返回泛型类的方法