文件系统队列
fsq的Python项目详细描述
fsq是posix文件系统中实现队列结构的标准。 fsq为目录布局和工作项命名提供了一个标准,其中 允许等幂工作项构造、原子排队和原子 完成。
fsq python库(import fsq)提供了一种编程方法来 从python对队列进行排队、扫描、内省和操作。
fsq程序提供排队、扫描、内省的机制, 从命令行审核和修复队列。
有关fsq标准的更多信息,请参见man 7 fsq,有关fsq程序的更多信息 见man 1 fsq。
安装
从pip
安装v0.2.5sudo 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打印堆栈将运行时错误跟踪到文件