多进程管理副本.key

Similar documents
ebook15-10

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

電腦做什麼事~第七章


第7章-并行计算.ppt








1

7. 小 星 星 一 閃 一 閃 亮 晶 晶, 滿 天 都 是 小 星 星 ; 掛 在 天 空 放 光 明, 好 像 許 多 小 眼 睛 ; 一 閃 一 閃 亮 晶 晶, 滿 天 都 是 小 星 星

WWW PHP

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

VHDL(Statements) (Sequential Statement) (Concurrent Statement) VHDL (Architecture)VHDL (PROCESS)(Sub-program) 2

秘密

untitled

E11701


C/C++ - 文件IO

003 就 是 取 各 種 學 說 療 法 的 優 點 來 治 療 的 意 思, 我 兼 取 中 西 醫 理 人 體 生 理 解 剖 經 脈 穴 位 易 理 學 說 臨 床 經 驗 等 各 種 學 理 經 驗 的 優 點, 並 且 採 用 氣 功 薰 臍 耳 穴 手 足 推 拿 按 摩 等 十 餘

Microsoft Word - 2B802內文.doc

東區校園中法治教育種子師資教學研習營

閱 讀 素 材 V.S 分 組 方 式 的 差 異 化 教 學 工 具 表 班 級 :( ) 閱 讀 素 材 V.S 分 組 方 式 獨 立 閱 讀 夥 伴 閱 讀 ( 同 質 性 ) 夥 伴 閱 讀 ( 異 質 性 ) 友 善 陪 伴 虛 心 受 教 國 語 日 報 新 聞 生 活 文 藝 兒 童

Microsoft Word - 1HF12序.doc

Microsoft Word - 讀報看科普─人體篇_橫_.doc

鍟嗗搧瑙傚療鈥㈤挗鏉

席 远 杨 一 人 了, 正 当 她 开 枪 时 却 发 现 子 弹 没 了 该 死, 只 能 赤 手 空 拳 了 洛 水 云 与 席 远 杨 交 起 手 来, 洛 水 云 出 手 招 招 致 命 想 那 席 远 杨 也 不 是 泛 泛 之 辈, 很 快 掌 握 了 洛 水 云 出 招 路 数 看

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

Microsoft PowerPoint - os_4.ppt

Go构建日请求千亿微服务最佳实践的副本

11

中醫夏季藥膳介紹

第四届全国大学生机械创新设计大赛

第一章

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

PowerPoint Presentation

Microsoft Word - 实用案例.doc

无类继承.key

ebook

<4D F736F F D204C696E7578CFB5CDB3B5F7D3C3C1D0B1ED>

NTSE: Non-Transactional Storage Engine MySQL InnoDB 10 InnoDB +Memcached 5 50% / K C++

Chapter 9: Objects and Classes


上 述 的 描 述 是 在 一 台 计 算 机 上 只 有 一 颗 CPU, 并 且 该 CPU 只 有 一 个 核 心 的 情 形, 在 这 种 环 境 下, 虽 然 系 统 可 以 运 行 多 个 任 务, 但 是 在 某 一 个 时 间 点,CPU 只 能 执 行 一 个 进 程 但 是 如

mvc

RunPC2_.doc

python内存管理

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

電腦做什麼事~第六章

婴幼儿教育(二).doc


ebook8-30

創 作 動 機 因 未 成 年 懷 孕 的 案 例 從 國 中 時 期 就 在 身 邊 屢 屢 發 生, 這 意 外 中 的 小 生 命 會 讓 一 個 人 或 說 是 一 對 父 母 的 人 生 產 生 劇 烈 衝 擊, 先 不 談 是 否 成 全 生 命 的 誕 生, 往 往 就 在 社 會 倫

Microsoft Word - Sable User's Manual.doc

Natural Language Processing, Topic Modeling, Neural Text Generation and Ali Xiaomi

本 期 回 顾 管 子 枢 言 : 家 室 富 足, 则 行 衰 矣 ; 爵 禄 满, 则 忠 衰 矣 我 们 拥 有 爱 情 的 时 候, 却 看 到 他 人 的 奔 驰, 而 拥 有 奔 驰 的 时 候 却 羡 慕 他 人 的 爱 情 当 我 们 富 足 的 时 候, 我 们 企 盼 可 以 儿

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

自由軟體教學平台

untitled

水龍頭實務

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

Microsoft Word - ACG chapter00c-3ed.docx

Java

Ø Ø Microsoft Project Ø Zou Zhige VLSI 2

第5章修改稿

投影片 1

目錄

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

第6章 信号量,中断和时间

C 1

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

普 通 高 等 教 育 十 二 五 重 点 规 划 教 材 计 算 机 系 列 中 国 科 学 院 教 材 建 设 专 家 委 员 会 十 二 五 规 划 教 材 操 作 系 统 戴 仕 明 姚 昌 顺 主 编 姜 华 张 希 伟 副 主 编 郑 尚 志 梁 宝 华 参 编 参 编 周 进 钱 进

C++ 程式設計

ebook70-21

Microsoft Word - 苹果脚本跟我学.doc

技 巧 5: 避 免 除 以 0 的 運 算 在 做 除 的 運 算 時, 先 檢 查 除 數 的 數 值, 避 免 有 除 以 0 的 情 況 若 運 算 中 除 數 為 0,SAS 會 在 LOG 中 註 記 提 醒 並 將 運 算 結 果 設 定 為 遺 漏 值, 減 慢 程 式 的 執 行

华恒家庭网关方案

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f

FY.DOC

在挑选合适的 SDK 的时候需要注意, 标准 windows 平台应用选择 FBX SDK VS2015,windows 应用商店和全平台通用的不用考虑 windows 全平台通用的应用是 windows10 新推出的功能, 可以打通 windows phone windows s

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

ebook35-2

穨IC-1000

Open topic Bellman-Ford算法与负环

Microsoft Word - PHP7Ch01.docx

jsj0.nps

M E M O 內 部 通 讯

M E M O 內 部 通 讯

ARM JTAG实时仿真器安装使用指南

33 8 No.8Vol.33 JOURNALOF NEIJIANG NORMAL UNIVERSITY MHz-RFID 1, 1, 2, 1, 1 1, * (1., ; 2., ) : 433 MHz, STM MHz, 433MHz,,.,,.

本文由筱驀釹贡献

untitled

RUN_PC連載_10_.doc

提纲 1 2 OS Examples for 3

Transcription:

美妙的多进程管理 造 个类 gunicorn 的轮 blog: xiaorui.cc github: github.com/rfyiamcool

内容 supervisor vs gunicorn vs uwsgi linux 异步信号 孤 进程 vs 僵 进程 daemon 的实现 prefork 是怎么 回事 打造 个较完善的多进程管理轮 怎么写代码

Master Worker elegance ctrl c signal reduce add Master pname zombie/child dup fork fork fork daemon monitor Worker Worker Worker signal reload oom/crash dynamic

supervisor vs gunicorn vs uwsgi supervisor 是基于执 件的, 可以控制多个应用进程. 但单纯的多进程 管理. gunicorn uwsgi 是基于 application 的, 且可以实现 wsgi 关接

file: process.py supervisor 实现 file: options.py class Subprocess(): def spawn(): filename, argv = self.get_execv_args() pid = options.fork() if pid!= 0: return self._spawn_as_parent(pid) else: return self._spawn_as_child(filename, argv) def _spawn_as_child(): options.dup2(self.pipes['child_stdin'], 0) options.dup2(self.pipes['child_stdout'], 1) options.dup2(self.pipes['child_stdout'], 2) options.execve(filename, argv, env) def execve(self, filename, argv, env): return os.execve(filename, argv, env) #execve 把新进程替换老进程, 继承 [program:web] command=python /var/www/service.py 80%(process_num)02d process_name=%(program_name)s_%(process_num)02d autostart=true autorestart=true umask=022 startsecs=0 stopwaitsecs=0 redirect_stderr=true stdout_logfile=/tmp/codoon.log numprocs=4

why repeat? 基于 function 更加细腻 dynamic add/reduce log reload / module reload / config reload kill friendly timeout? force to kill queue, 共享变量, 锁... ( 封装好 ) more

Linux Signal for diy 信号 数字 描述 sigint 2 键盘 ctrl c sigquit 3 键盘 ctrl d or \ sigkill 9 暴 终 进程 sigalrm 14 定时器超时 sigterm 15 默认的 kill 信号 sigchld 17 进程退出发出的信号 sigttin 21 增加 个进程 sigttou 22 减少 个进程 sigwinch 34 清理 worker 进程

signal 不可靠信号 : 也称为非实时信号, 不支持排队, 信号可能会丢失, 比如 发送多次相同的信号, 进程只能收到 次. 信号值取值区间为 1~31; 可靠信号 : 也称为实时信号, 支持排队, 信号不会丢失, 发多少次, 就可 以收到多少次. 信号值取值区间为 32~64 信号不排队

signal. sigkill 法捕获 什么时候会被 sigkill. 自 贱,kill -9 pid. 内存占用厉害, 被 oom 了. ulimit 设置了 cpu timeout

在 python 下注册 sigkill error In [3]: def trycache(*args):...: print args...: In [4]: signal.signal(signal.sigkill,trycache) ----------------------------------------------------------------------- ---- RuntimeError Traceback (most recent call last) <ipython-input-4-7f0697d1acc4> in <module>() ----> 1 signal.signal(signal.sigkill,trycache) RuntimeError: (22, 'Invalid argument')

孤 进程 vs 僵 进程 孤 进程 : 个 进程退出, 它的 进程还在运, 那么那些 进程将成为 孤 进程 孤 进程将被 init 进程 ( 进程号为 1) 所收养, 并由 init 进程对它们完成 状态收集 作 僵 进程 : 个进程使用 fork 创建 进程, 如果 进程退出, 进程并没有调 用 wait 或 waitpid 获取 进程的状态信息, 那么 进程的进程描述符仍然保存在 系统中 这种进程称之为僵死进程

怎么解决僵 问题 通过 signal(sigchld, SIG_IGN) 通知内核对 进程的结束不关, 由内核回 收 进程调用 wait/waitpid 函数进 收, 如果尚 进程退出 wait 会导致 进 程阻塞 waitpid 可以通过传递 WNOHANG 使 进程不阻塞立即返回 通过 SIGCHLD 的注册函数来处理信号, 如 下 很多信号发出, 那么会有 丢失信号的问题, 因为内核发信号不排队... 孤 进程的 式, 通过 fork setsid 实现

import multiprocessing import time def daemon(): while 1: time.sleep(10) def non_daemon(): while 1: time.sleep(100) def non_daemon_break(): time.sleep(3) # 就是让他主动退出 if name == ' main ': t = [] t.append( multiprocessing.process(name= daemon', target=daemon)) t.append( multiprocessing.process(name= non-daemon', target=non_daemon)) t.append( multiprocessing.process(name= non-daemon', target=non_daemon_break)) for i in t: i.daemon = True i.start() while 1: time.sleep(1)

import time import os import multiprocessing def daemon(): while 1: time.sleep(10) def non_daemon(): while 1: time.sleep(100) def non_daemon_break(): time.sleep(3) # 因为是孤 进程, 进程由 init 收 了. if name == ' main ': t = [] t.append(multiprocessing.process(name= daemon', target=daemon)) t.append(multiprocessing.process(name= non-daemon', target=non_daemon)) t.append(multiprocessing.process(name= non-daemon', target=non_daemon_break)) for i in t: i.daemon = True i.start() os.kill(os.getpid(), 15)

Daemon 守候进程 fork 进程, 然后 进程退出, 这已经构成基本的 daemon! 但 进程还 在 进程的会话里面. 进程调用 setsid, 使 进程成为新的会话组长. 但新的会话组长可申请 控制终端. 再次 fork 个 孙进程, 掉 进程, 保留孙 进程. 切换 作目录, 关闭 stdin\stdout\stderr 的句柄,umask

如何摆脱终端? 进程 > 进程组 > 会话 = 登录终端 摆脱当前终端, new session 关闭终端会触发 SIGHUP 屏蔽 SIGHUP NOHUP = signal(sighup, SIG_IGN) NOHUP sleep 100 > dehub.log 2 > &1 == ignore sighup + os.dup(1,2)

import os import time def daemonize(): pid=os.fork() # fork1 if pid<0: # error print "fork1 error" return -1 elif pid>0: # parent. exit(0) os.chdir("/") os.setsid() pid=os.fork() # fork 2 if pid<0: print "fork2 error" return -1 elif pid>0: exit(0) os.umask(022) os.close(0) os.close(1) os.close(2) fd=os.open('/dev/null', 2) os.dup(fd) os.dup(fd) daemon 代码示例 if name == " main ": daemonize() time.sleep(30)

那么问题来了, 如何造 个健全的后端服务! 用配置 件控制 uid 权限规范进程名 daemon 守候进程调整进程, Add Reduce 调优配置 : 最 处理任务, 是否线程 协程捕获各种信号, 解决僵 进程 fcntl lock/check sock.pid 传参获取服务状态, 重启服务, 开启, 停

a program fd table fd0 flag 指针 fd1.. fd1.. fd table fd0 flag 指针 fd1.. file table 件状态标志 offset v node 指针 v 节点表 v 节点信息 i 节点信息当前 件长度 fd1..

end - xiaorui.cc