Python学习笔记(四)多进程的使用
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学习笔记(四)多进程的使用的更多相关文章
- Python学习笔记(四)Python函数的参数
Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...
- Python学习笔记四
一.装饰器 1.知识储备 函数对象 函数可以被引用 函数可以当参数传递 返回值可以是函数 可以当作容器的元素 def func1(): print (666) def func2(): print ( ...
- Python学习笔记四:面向对象编程
一:定义类并创建实例 Python中定义类,通过class关键字,类名开头大写,参数列表为所继承的父类.如果没有需要明确继承的类,则继承object. 使用类来创建对象,只需 类名+() 形式即可,p ...
- python学习笔记——multiprocessing 多进程组件-队列Queue
1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...
- python学习笔记——multiprocessing 多进程组件 Pipe管道
进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- python学习笔记——multiprocessing 多进程模块Process
系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持: python中的multiprocess为跨平台版本的多进程模块,支持子进程.通信和共享数据.执行不同 ...
- python学习笔记(四) 思考和准备
一.zip的坑 zip()函数接收多个可迭代数列,将数列中的元素重新组合,在3.0中返回迭代器指向 数列首地址,在3.0以下版本返回List类型的列表数列.我用的是3.5版本python, 所以zip ...
- python学习笔记(四):函数
一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...
- python学习笔记(四):生成器、内置函数、json
一.生成器 生成器是什么?其实和list差不多,只不过list生成的时候数据已经在内存里面了,而生成器中生成的数据是当被调用时才生成呢,这样就节省了内存空间. 1. 列表生成式,在第二篇博客里面我写了 ...
随机推荐
- springboot 返回json格式数据的时间格式配置
#时间戳统一转换 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 NOTE:time-zon ...
- Django组件之contenttype的应用
contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建了新的model并执行数据库迁移后,Conte ...
- Laravel5.5新特性
1.新的报错页面 报错更加美观,并标记显示出错误的代码 2.包的自动配置 在conposer.json文件中加入包中的配置,下载后就会自动配置到app.php 文件中,使用更方便 在之前的 Larav ...
- Vmware esxi开启snmp服务
https://jingyan.baidu.com/article/9f7e7ec055c4c86f28155435.html http://pubs.vmware.com/vsphere-50/in ...
- 【转】学一点Git--20分钟git快速上手
看到一篇不错的Git的简单入门教程,转过来给自己留个底. 原文地址:http://www.cnblogs.com/shuidao/p/3535299.html 在Git如日中天的今天,不懂git都不好 ...
- Spring的自动装配
在Spring中对自定义的引用类型注入时可以实现自动赋值.但是必须依赖set方法: 自动装配功能有两种: <!-- autowire:"byType" --根据class匹 ...
- 安装mezzanine时报:storing debug log for failure【已解决】
同时还提示: bz2 module is not found(貌似) 解决方法: 1.重新安装python wget http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz ...
- 线段树【CF620E】The Child and Sequence
Description At the children's day, the child came to Picks's house, and messed his house up. Picks w ...
- 记录(Record)
记录有可以被称为行(Row),可以通俗的认为它是数据表中的一行数据.以员工表为例,一个公司的员工表中的数据是这样的: 这里每一行数据就代表一个员工的资料,这样的一行数据就叫做一条记录.表是由行和列组成 ...
- 学习python网站
http://code.ziqiangxuetang.com/python/python-dictionary.html