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,编写一个多进程的并发服务器。

完。

时间: 2024-10-13 18:08:31

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

Python学习笔记(四)

一.list创建 list 是Python语言中一种内置的数据类型 list 中可以存放不同类型的数据 list = []  #创建一个空列表 list = [1,2,3] #创建一个非空列表,并初始化其元素为1,2,3 二.list长度 使用 len(list_变量) 可以测得list的长度 三.list切片 list = [1,2,3,4,5,6,7,8,9,10] print(list[3:])  #4,5,6,7,8,9,10 print(list[3:5]) #4,5 print(li

python学习笔记(多进程并发)

理论篇: 1.什么是进程: 进程:计算机系统中正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 2.进程和程序的区别: 程序是实现功能的一堆代码,而进程是程序运行的过程. 注:同一个程序同时打开两次或多次,就会启动两个或多个进程. 3.并发与并行: 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务 一 并发:是伪并行,即看起来是同时运行.单个cpu+多道技术就可以实现

python学习笔记(四):函数

一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method. 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 二.使用函数的好处: 1.简化代码2.提高代码的复用性3.代码可扩展 三.p

Python学习笔记四(迭代器、生成器、内置函数)

一.迭代器 1.迭代器定义 迭代是一个重复的过程,每次重复一次迭代,并且每次迭代的结果都是下一次迭代的初始值. l = ["aaa","bbb","ccc"] count = 0 while count< len(l): #每次重复完成后count都是下一次的初始值 print(l[count]) count+=1 需要迭代器的原因:对于序列类型str.list.tuple可以依赖索引迭代取值,对于dict.set.文件需要提供不依赖索引取

Python学习笔记四

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 Python高级特性 一.切片 如果要取出一个列表或元组的部分元素,可以通过直接下标方法: lista=['apple','banana','cherry'] lista[0] lista[1] lista[2] 但如果要取再多个,或者前面(后面)多少个,或中间多少个,直接访问的方法就很不方便了. Python

[Python笔记]Python学习笔记四

模块 在Python中,一个.py文件就是一个模块(Module) 使用模块的好处就是大大提高代码的可维护性,并且可以被其他地方引用. 同时可以避免函数名和变量名的冲突. Package(包) 每个包目录下面必须有一个 __init__.py文件 这个文件可以是空的,这个文件对应模块名就是当前目录名即包名 模块的使用 Python内置了很多模块 #!/usr/bin/env python # -*- coding:utf-8 -*- # 编写一个属于自己的模块 # 文件的第一个字符串被视为模块的

python学习笔记(四) - 函数式编程

一. 高阶函数 高阶函数:把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式 def add(x, y, f): return f(x) + f(y) print add(-5, 6, abs) # 11 二.返回函数 aaa 三.匿名函数 aaa 四.装饰器 aaa 五.偏函数 aaa

Python学习笔记四--字典与集合

字典是Python中唯一的映射类型.所谓映射即指该数据类型包含哈希值(key)和与之对应的值(value)的序列.字典是可变类型.字典中的数据是无序排列的. 4.1.1字典的创建及赋值 dict1={} dict2={'name':John,'age':24} 使用dict()函数创建字典. dict()函数接受序列,或关键字参数作为参数创建字典.若不提供参数则创建空字典. dict1=dict([['x',1],['y',2]])#接受list作为参数创建字典 dict2=dict(x=1.y

Python学习笔记(四)Python对象类型及其运算

Python对象的相关术语: Python程序中保存的所有数据都是围绕对象这个概念展开的 程序中存储的所有数据都是对象 每个对象都有一个身份,一个类型和一个值 例如,school="MaGe linux"会以"MaGe linux"创建一个字符串对象,其身份是指向它在内存中所处位置的指针(其在内存中的地址),而school就是引用这个具体位置的名称 In [14]: name="herry" In [15]: id(name) Out[15]: 

python学习笔记四:字符串格式化

字符串格式化:%,左侧放字符串,右侧放希望被格式化的值,通常为元组 >>> format = "Hello, %s, %s enough for ya?" >>> values = ('world', 'Hot') >>> print format % values Hello, world, Hot enough for ya? 如果在格式化字符串里面包括百分号,那么必须使用%% 模板字符串:类似于shell中的变量替换 1)