文件系统队列

fsq的Python项目详细描述


fsq是posix文件系统中实现队列结构的标准。 fsq为目录布局和工作项命名提供了一个标准,其中 允许等幂工作项构造、原子排队和原子 完成。

fsq python库(import fsq)提供了一种编程方法来 从python对队列进行排队、扫描、内省和操作。

fsq程序提供排队、扫描、内省的机制, 从命令行审核和修复队列。

有关fsq标准的更多信息,请参见man 7 fsq,有关fsq程序的更多信息 见man 1 fsq

安装

fsq项目位于github,可通过pip访问。

从pip

安装v0.2.5
sudo pip install fsq==0.2.5

从源安装v0.2.5

curl https://github.com/axialmarket/fsq/archive/version_0.2.5.tar.gz | tar vzxf -
cd fsq
sudo python setup.py install

快速概述

安装队列

要安装队列,只需运行:

$ fsq install a_queue

或者通过python api:

>>> import fsq
>>> fsq.install(a_queue)

安装队列将在FSQ_ROOT/var/fsq/)中创建目录:

/var/fsq/a_queue
├── done
├── fail
├── queue
└── tmp

排队工作

要将工作排队到a_queue队列,只需运行:

$ echo "data" | fsq enqueue a_queue args to enqueue

或者来自python api:

>>> import fsq
>>> # enqueue a string
>>> fsq.senqueue('a_queue', 'data', 'args', 'to', 'enqueue')
>>> # ... or a file
>>> fsq.senqueue('a_queue', '/path/to/data.file', 'args', 'to', 'enqueue')

排队将文件添加到a_queue

/var/fsq/a_queue
├── done
├── fail
├── queue
|   └── _20131005205643_0_25577_mss_0_args_to_enqueue
└── tmp

处理工作

要处理作业,请使用fsq scan程序:

$ # echo gets "args", "to", "enqueue" as $1..$3 and "data" on stdin
$ fsq scan a_queue echo
args to enqueue

或者来自python api:

>>> import fsq
>>> for work in fsq.scan('a_queue'):
...     print " ".join(work.arguments)
...     fsq.done('a_queue')
args to enqueue

已成功完成的工作移动到已完成目录:

/var/fsq/a_queue
├── done
|   └── _20131005205643_0_25577_mss_0_args_to_enqueue
├── fail
├── queue
└── tmp

当fsq扫描每个工作项时,它获得对该工作项的独占锁。 文件,因此可以安全地在上并行运行多个扫描进程(或线程) 同样的队伍,不怕重复劳动。

处理工作失败

如果在处理过程中工作失败:

$ fsq scan a_queue sh -c 'exit 100'

或者来自python api:

>>> import fsq
>>> for work in fsq.scan('a_queue'):
...     fsq.fail('a_queue')

失败的工作将移动到失败目录:

/var/fsq/a_queue
├── done
├── fail
|   └── _20131005205643_0_25577_mss_0_args_to_enqueue
├── queue
└── tmp

工作也可能暂时失败,这将导致工作停留在 queue目录,直到它早于FSQ_TTL秒,或者直到 它已经尝试了超过FSQ_MAX_TRIES次,但没有成功:

$ # exit code 111 indicates temporary failure
$ FSQ_MAX_TRIES=2 fsq scan a_queue sh -c 'exit 100'

或者来自python api:

>>> import fsq
>>> fsq.set_const('FSQ_MAX_TRIES', 2)
>>> for work in fsq.scan('a_queue'):
...     fsq.fail_tmp(work)

工作项的名称将更改以指示该项已失败 一次:

/var/fsq/a_queue
├── done
├── fail
├── queue
|   └── _20131005205643_0_25577_mss_1_args_to_enqueue
└── tmp

排长队

要暂时停止对任何队列的所有扫描,只需使用fsq down 程序:

$ fsq down a_queue

或者来自python api:

>>> import fsq
>>> fsq.down('a_queue')

a_queue目录中创建名为down的常规文件 阻止扫描处理队列:

/var/fsq/a_queue
├── done
├── down
├── fail
├── queue
|   └── _20131005205643_0_25577_mss_0_args_to_enqueue
└── tmp

要重新启动队列,只需使用fsq up程序:

$ fsq up a_queue

或者来自python api:

>>> import fsq
>>> fsq.up('a_queue')

它删除down文件,并允许正确扫描队列 再一次。

tmp目录

fsq在一个队列中使用tmp目录来确保 所有项目都按原子顺序排队。

fsq文件名

_20120710213904_0_13044_mss_0_args_to_enqueue
_20120710213904_1_13044_mss_0_args_to_enqueue
+|-----+------| + |-+-| |+| + |------+------|
|      |        |   |    |  |        |
|      |        |   |    |  |        +-> FSQ_DELIMITER seperated
|      |        |   |    |  |            arguments
|      |        |   |    |  +-> tries: number of failed attempts
|      |        |   |    |      to process
|      |        |   |    +-> hostname: the name of the host on
|      |        |   |        which the work-item was enqueued.
|      |        |   +-> pid of the process which enqueued the
|      |        |       work-item
|      |        +-> entropy: should a work-item be generated
|      |            with the same arguments, pid, hostname
|      |            and timestamp, entropy is incremented to
|      |            generate uniqueness.
|      +-> timestamp in FSQ_TIMEFMT format
+-> FSQ_DELIMITER used at enqueue time

环境

fsq套件和python库使用了许多环境 变量(每个前缀为FSQ_),用于修改其行为。每个 环境变量也可用作包级常量。

请参考man 7 fsq获取完整列表。


热门话题
java需要一种简单的方法来创建用于排序的comparator类   java getReadableDatabase和getWriteableDatabase无法解析   查找列表<Long>中与某个元素对应的所有索引的java方法   安卓将视图添加到ViewFlipper会导致java。StackOverflowerr语言   java根据它所包含的长“curTime”类字段将N的列表拆分为24(小时)   Android N中的Java8流API   自动生成Java策略文件的安全性   垃圾收集鼓励Java中的主要GC(但不是STW GC)   java如何检查UDP服务器上侦听的客户端数量   在前一台主机被Datastax Java驱动程序关闭后,Cassandra尝试重新连接到下一台主机   java如何使用Spring Boot创建部分代理   java是否有一个网站或资源可以完全比较EJB版本   java无需使用第三方库从gradle生成输出   继承由于这个多态性的基本示例中的语法有什么不同吗?(爪哇)   java字符串数组中的空字符串   java为什么CMS中的初始标记阶段是串行的   为什么Lucene有时与InChIKeys不匹配?   安卓通知Java应用程序数据库中的更改   java如何将单个json对象值解析为按钮   java打印堆栈将运行时错误跟踪到文件