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. MATLAB作图方法与技巧(一)

    下面从折线图.曲面图和图形说明与定制三个方面说明MATLAB作图的一些方法与技巧,注意,文中出现的单引号在MATLAB中实际运行的时候,需要改为MATLAB认可的单引号. 一. 作折线图 1.plot ...

  2. 解决 org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType

    参考:http://www.cnblogs.com/qgc88/p/3283217.html 解决方法: 删除aspectjweaver.jar和aspect.jar 加入aspectjweaver- ...

  3. elasticsearch中client.transport.sniff的使用方法和注意事项

    https://blog.csdn.net/J_bean/article/details/79507559

  4. SVN的配置和使用

    1.安装前必备 获取 Subversion 服务器程序 到官方网站 http://subversion.tigris.org/    我下的是CollabNetSubversion-server-1. ...

  5. [loj#115] 无源汇有上下界可行流 网络流

    #115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据   题 ...

  6. HDU1385 Minimum Transport Cost (Floyd)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  7. 【树链剖分(区间线段树)】BZOJ4196-[NOI2015]软件包管理

    [题目大意] 如果软件包A依赖软件包B,那么安装软件包A以前,必须先安装软件包B.同时,如果想要卸载软件包B,则必须卸载软件包A.而且,由于你之前的工作,除0号软件包以外,在你的管理器当中的软件包都会 ...

  8. python3开发进阶-Django框架的起飞加速一(ORM)

    阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...

  9. (转)MoMo的Unity3D研究院之Assetbundle的原理(六十一)

    http://www.xuanyusong.com/archives/2373 Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbun ...

  10. css sprite demo

    一张图片,用CSS分割成多个小图标. css样式: .icon{ background:url(../images/tabicons.png) no-repeat;width:18px; line-h ...