python runner.daemonrunner_在python中将参数传递给daemon runner
为了保持守护进程的运行,防止它消耗所有资源,避免让僵尸进程困扰您的系统,需要进行大量的簿记工作,等等
下面是我们运行的最简单守护进程的简化版本(它使许多工作进程保持运行和循环)。它呼唤着commandq.run_命令()做实际工作(不包括在内)。在
如果你能用一个更简单的cron作业(你需要一个cron作业或类似的作业来验证守护进程是否正在运行)。在import os, sys, time, argparse, random, signal
import multiprocessing
import psutil
# originally from http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
# now at https://gist.github.com/dcai/1075904/6f7be00f7f411d5c2e7cd1691dcbb68efacb789c
import daemon
def _ensure_dir(*pth):
path = os.path.join(*pth)
if os.path.exists(path):
if not os.path.isdir(path):
raise RuntimeError("%r is not a directory!" % path)
else:
os.makedirs(path, 0775)
return path
PID_DIRECTORY = _ensure_dir('/var/run/commandq/')
PID_FNAME = 'commandq-worker.pid'
PID_FILE = os.path.join(PID_DIRECTORY, PID_FNAME)
def worker(args, parentpid):
"""Command Queue worker process.
"""
# number of tasks to process before dying (we can't just keep looping
# in case the client code has resource leaks..)
recycle = args.recycle
def sleep_or_die(n=0):
"""If our parent died (or got killed), we commit suicide.
(this is much easier than trying to kill sub-treads from the
parent).
"""
# os.getppid() only exists on Linux..
if os.getppid() != parentpid: # i.e. parent died
sys.exit()
# back off if the system is busy (i.e. don't cause a death spiral..)
if psutil.cpu_percent() > 70.0:
time.sleep(25)
if os.getppid() != parentpid: # check that parent didn't die
sys.exit()
if n > 0:
time.sleep(n)
while recycle:
sleep_or_die() # don't take all cpu-resources
try:
# WORK: pulls a unit of work and executes it
# - raises NoWork if work queue is empty
# - raises LockException if too much lock
# contention (i.e. timeout waiting for lock)
commandq.run_command()
except commandq.NoWork as e:
# introduce randomness to prevent "harmonics"
sleeptime = random.randrange(1, 5)
sleep_or_die(sleeptime)
except commandq.LockException as e:
# too much lock contention... back off a little.
sleep_or_die(random.randrange(3, 10))
recycle -= 1
def start_workers(count, args):
"Start ``count`` number of worker processes."
procs = [multiprocessing.Process(target=worker, args=(args, os.getpid()))
for _i in range(count)]
_t = [t.start() for t in procs]
return procs
def main(daemon):
"Daemon entry point."
args = daemon.args
procs = start_workers(args.count, args) # start args.count workers
while 1:
# active_children() joins finished processes
procs = multiprocessing.active_children()
missing = args.count - len(procs)
if missing:
# if any of our workers died, start replacement processes
procs += start_workers(missing, args)
time.sleep(5)
if os.getpid() != daemon.getpid():
# a second copy has started, i.e. we should stop running
return
#[t.join() for t in procs] # subprocesses will die when they discover that we died.
class WorkerDaemon(daemon.Daemon):
"Worker daemon."
args = None
def run(self):
"main() does all the work."
def sigint_handler(signum, frame):
self.delpid()
signal.signal(signum, signal.SIG_DFL)
# re-throw signal (this time without catching it).
os.kill(os.getpid(), signum)
# make sure we don't leave sub-processes as zombies when someone
# kills the deamon process.
signal.signal(signal.SIGINT, sigint_handler)
signal.signal(signal.SIGTERM, sigint_handler)
main(self)
if __name__ == "__main__":
cpucount = multiprocessing.cpu_count()
parser = argparse.ArgumentParser(description='Command Queue worker.')
parser.add_argument(
'-n', dest='count', type=int, default=cpucount,
help='number of worker processes (defaults to number of processors).')
parser.add_argument('action', nargs='?',
help='stop|restart|status of the worker deamon.')
# when we move to 2.7 we can use the maxtaskperchild argument to
# multiprocessing.Pool
parser.add_argument(
' recycle', dest='recycle', type=int, default=400,
help='number of iterations before recycling the worker thread.')
_args = parser.parse_args()
daemon = WorkerDaemon(PID_FILE)
daemon.args = _args
if _args.action == 'status':
if daemon.status():
print "commandq worker is running."
else:
print "commandq worker is NOT running."
sys.exit(0)
elif _args.action == 'stop':
daemon.stop()
elif _args.action == 'restart':
daemon.restart()
else:
daemon.start()
sys.exit(0)
python runner.daemonrunner_在python中将参数传递给daemon runner相关推荐
- python pytest setupclass_python – Pytest – 如何将参数传递给setup_class?
我有一些代码如下所示. 我运行时得到的args错误太少了. 我没有显式调用setup_class,因此不确定如何将任何参数传递给它. 我尝试用@classmethod修饰方法,但仍然看到相同的错误. ...
- adf开发_如何在ADF中将参数传递给ActionListener
adf开发 在某些情况下,需要将值传递给ADF Button的ActionListener. 可以由actionListeners调用的方法只有一个ActionEvent类型的参数. 因此,我将解释如 ...
- 如何在ADF中将参数传递给ActionListener
在某些情况下,需要将值传递给ADF Button的ActionListener. 可以由actionListeners调用的方法只有一个ActionEvent类型的参数. 因此,我将解释如何将参数传递 ...
- 将参数传递给Bash函数
我试图搜索如何在Bash函数中传递参数,但是出现的是如何从命令行传递参数. 我想在我的脚本中传递参数. 我试过了: myBackupFunction("..", "... ...
- java变量传递给asp,我应该如何将多个参数传递给ASP.Net Web API GET?
回答(10) 2 years ago 这个记录标记是什么意思?如果这仅用于记录目的,我将使用GET并禁用所有缓存,因为您要记录此资源的每个查询 . 如果记录标记有另一个目的,POST就是要走的路 . ...
- 如何将参数传递给setTimeout()回调?
我有一些如下的JavaScript代码: function statechangedPostQuestion() {//alert("statechangedPostQuestion&quo ...
- 通过BeanShell获取UUID并将参数传递给Jmeter
有些HTTPS请求报文的报文体中包含由客户端生成的UUID,在用Jmeter做接口自动化测试的时候,因为越过了客户端,直接向服务器端发送报文,所以,需要在Jmeter中通过beanshell获取UUI ...
- java+hadoop配置参数_将Hadoop参数传递给Java代码
我有一个Uber jar执行一些级联ETL任务. jar的执行方式如下: hadoop jar munge-data.jar 我希望在作业启动时将参数传递给jar,例如 hadoop jar mung ...
- 如何将命令行参数传递给Node.js程序?
我有一个用Node.js编写的Web服务器,我想使用一个特定的文件夹启动. 我不确定如何在JavaScript中访问参数. 我正在像这样运行节点: $ node server.js folder 这是 ...
最新文章
- JQuery 进入页面默认给已赋值的复选框打钩
- 内存泄漏分析 mat 使用 activity泄漏
- jquery 常用属性和函数(part I)
- IntelliJ IDEA的光芒会盖过Eclipse吗
- Python3-笔记-E-001-库-随机数random
- 2ex1逆向寒假生涯(24/100)
- redis(9)--数据库
- php下载文件与服务器有关吗,php 下载文件功能中下载后文件大小与服务器源文件大小不一致...
- 为什么长视频没有强算法推荐的产品
- python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
- java 骗局_Java有陷阱,用时需谨慎——慎用入参做返回值
- 金融数据分析(十)人均国内生产总值的增长率
- 【思考】windows补丁提权的疑问
- 使用Dockerfile制作ffmpeg镜像
- html实现个人自我介绍(精)
- 微信支付宝H5收款码扫码转账个人通道仿原生接口带备注可回调成功率9成以上
- Python 简单的人名对话
- 数据结构复习题(线性表)
- JavaScript实现蜘蛛纸牌
- SprinBoot+Jpa实现1024社区系统的最新职位推荐和最热职位推荐
热门文章
- 深入探索android热修复技术原理_打卡活动:技术书籍书单
- 计算机软考可以直接高级吗,计算机软考没有中级能考高级吗
- pandas dataframe 一行变多行 (query pv统计term pv)
- PHP面向对象的魔术方法
- leetcode Add Digits
- Deep Learning 10_深度学习UFLDL教程:Convolution and Pooling_exercise(斯坦福大学深度学习教程)...
- 直接在低版本IE6/7/8浏览器中使用HTML5的audio和video标签播放视频音频的办法
- [Erlang危机](4.4)命名管道
- asp.net 分页
- 新浪sae平台进行数据库的连接