python中多进程与Linux 下的C基本相同。

 

fork的基本使用

 

先看最简单的例子:

# coding: utf-8
import os def my_fork():
pid = os.fork()
if pid == 0:
print 'this is child, pid = %d, parent id = %d' % (os.getpid(), os.getppid())
elif pid > 0:
print 'this is parent, pid = %d, child id = %d' % (os.getpid(), pid)
os.waitpid(pid, 0) #等待子进程结束 if __name__ == '__main__':
my_fork()

这个例子演示了fork的基本使用,还有就是我们最后使用了waitpid来回收子进程。

如果不知道具体的子进程号码,可以使用wait函数。

 

管道pipe的使用

 

代码如下:

# coding: utf-8
import os
from time import sleep def my_fork():
r, w = os.pipe()
pid = os.fork()
if pid == 0:
os.close(r) #关闭读端
w = os.fdopen(w, "w")
for i in range(10):
w.write('%s\n' % (str(i+1))) #最后加上\n
w.flush() #这里记得刷新
sleep(0.5)
w.close()
elif pid > 0:
os.close(w) #关闭写端
r = os.fdopen(r, "r")
while True:
data = r.readline() #不要使用read
if not data:
print 'close.'
break;
print 'received : %s' % (data)
os.waitpid(pid, 0) #等待子进程结束 if __name__ == '__main__':
my_fork()

在子进程中,连续10次发送数字。

这里有几点值得注意:

write时加上\n符号

接收时使用readline函数

每发送完一个数据,就刷新flush一次缓冲区

 

使用信号处理僵尸进程

 

Python中也可以使用信号处理函数,例如最简单的中断信号:

# coding: utf-8
import os
import signal
from time import sleep def handler(a, b):
print 'Ctrl + C' if __name__ == '__main__':
signal.signal(signal.SIGINT, handler)
while True:
pass

每按一次Ctrl+C,就触发一次这个函数。

 

代码如下:

# coding: utf-8
import os
import signal
from time import sleep def handler(a, b):
(pid, status) = os.wait()
print 'Child %d Finish, status = %d' % (pid, status) def my_fork():
pid = os.fork()
if pid == 0:
print 'this is child, pid = %d, parent id = %d' % (os.getpid(), os.getppid())
elif pid > 0:
print 'this is parent, pid = %d, child id = %d' % (os.getpid(), pid) while True:
pass if __name__ == '__main__':
signal.signal(signal.SIGCHLD, handler)
my_fork()

每当有子进程消亡,就触发SIGCHLD信号,然后在处理函数中调用wait函数。这里比Linux下简单,不必使用while循环回收。

 

下节使用python,编写一个多进程的并发服务器。

完。

Python学习笔记(四)多进程的使用的更多相关文章

  1. Python学习笔记(四)Python函数的参数

    Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...

  2. Python学习笔记四

    一.装饰器 1.知识储备 函数对象 函数可以被引用 函数可以当参数传递 返回值可以是函数 可以当作容器的元素 def func1(): print (666) def func2(): print ( ...

  3. Python学习笔记四:面向对象编程

    一:定义类并创建实例 Python中定义类,通过class关键字,类名开头大写,参数列表为所继承的父类.如果没有需要明确继承的类,则继承object. 使用类来创建对象,只需 类名+() 形式即可,p ...

  4. python学习笔记——multiprocessing 多进程组件-队列Queue

    1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...

  5. python学习笔记——multiprocessing 多进程组件 Pipe管道

    进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...

  6. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  7. python学习笔记——multiprocessing 多进程模块Process

    系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持: python中的multiprocess为跨平台版本的多进程模块,支持子进程.通信和共享数据.执行不同 ...

  8. python学习笔记(四) 思考和准备

    一.zip的坑 zip()函数接收多个可迭代数列,将数列中的元素重新组合,在3.0中返回迭代器指向 数列首地址,在3.0以下版本返回List类型的列表数列.我用的是3.5版本python, 所以zip ...

  9. python学习笔记(四):函数

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...

  10. python学习笔记(四):生成器、内置函数、json

    一.生成器 生成器是什么?其实和list差不多,只不过list生成的时候数据已经在内存里面了,而生成器中生成的数据是当被调用时才生成呢,这样就节省了内存空间. 1. 列表生成式,在第二篇博客里面我写了 ...

随机推荐

  1. lucene 排序

    (1)排序对一个文档里什么域都没存储,使用字符串排序会排在首位 (2)排序对一个文档里什么域都没存储,使用数字类型排序会默认给其赋值为0进行排序 (3)我们可以对数字类型的null值的文档进行代码控制 ...

  2. jquery事件之select选中事件

    根据select下拉列表选中的不同选项执行不同的方法,工作中经常会用到,这里就要用到Jquery的select选中事件 这里给select加一个叫label_id的id,然后通过id选择器找到这个节点 ...

  3. python redis使用方法

    一.mac 下redis安装 1.brew安装redis brew install redis 2.启动redis服务器 brew services start redis 或者 redis-serv ...

  4. Codeforces Gym100952 A.Who is the winner? (2015 HIAST Collegiate Programming Contest)

      A. Who is the winner?   time limit per test 1 second memory limit per test 64 megabytes input stan ...

  5. 分享HTTP Status 404(The requested resource is not available)的几种解决方案解决方法

    下面是直接copy的,如果有什么疑问or补充,请不吝指教! 原文地址:http://www.myexception.cn/java-web/1480013.html 这个问题搞了我两天的时间,找了各种 ...

  6. (2)Flutter vscode安装

    1. vscode搜索Flutter 点击安装Flutter会自动安装Flutter和Dart 2.打开项目 在vscode File-openFolder打开之前创建的项目 成功显示 如果创建一个新 ...

  7. HDU 1060 Leftmost Digit (数论,快速幂)

    Given a positive integer N, you should output the leftmost digit of N^N.  InputThe input contains se ...

  8. 带WHERE子句的UPDATE语句

    目前演示的几个UPDATE语句都是一次性更新所有行的数据,这无法满足只更新符合特定条件的行的需求,比如“将Tom 的年龄修改为12 岁”.要实现这样的功能只要使用WHERE 子句就可以了,在WHERE ...

  9. [Contest20180325]序列

    Hogura有一个序列$a$,她希望你帮她维护下面的这些操作. $1\ l\ r\ x$对$l\leq i\leq r$的$a_i$执行$a_i=a_i+x$ $2\ l\ r\ x$对$l\leq ...

  10. 【枚举】bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠

    由于子弹的轨迹是可逆的,因此我们可以枚举所有敌人的位置,然后统计他们能打到的位置,这些位置也就是能打到他们的位置咯. O(n*k). #include<cstdio> using name ...