python全栈开发day32-进程创建,进程同步,进程间的通信,进程池

一、内容总结

  1.进程创建

    1)   Process:两种创建一个新进程的方法:

        1.实例化Process,通过args=(,)元组形式传参,2创建类继承Process,类初始化的时候传参数

    2)  p.join(),阻塞主进程,执行完p进程后,释放

    3)   守护进程 ,守护主程序代码执行完毕,p.daemon = True     

import time
from multiprocessing import Process

def func():
    while True:
        print(‘is alive‘)
        time.sleep(0.5)

def wahaha():
    i = 0
    while i < 5:
        print(‘第%s秒‘%i)
        time.sleep(1)
        i += 1

if __name__ == ‘__main__‘:
    p2 = Process(target=wahaha)
    p2.start()
    p1 = Process(target=func)
    p1.daemon = True   # 设置p1为守护进程
    p1.start()
    time.sleep(3)
    print(‘主进程‘)
    p2.join()   # 守护进程会等待子进程结束后才结束守护

守护进程代码

    4)  p.terminate() 不会立即结束,会等待主进程回收资源等

 # python和进程
    # multiprocessing模块
    # 主进程
    # 父子进程
        # 父进程需要等待子进程执行结束之后才结束
            # 负责回收子进程的一些资源
        # 进程与进程之间数据隔离
            # 子进程可以在创建之初接收参数
            # 但是不能直接返回值
        # 异步 父子进程之间的工作是互不干扰的
    # 开启一个子进程
        # multiprocessing.Process
        # 第一种方式
            # 实例化创建一个进程
            # start开启一个进程
        # 第二种方式
            # 采用面向对象的形式来创建进程
                # 继承Process
                # 在init处传参数
                # 重写run方法
    # 子进程的控制
        # join         

  2.进程的同步

    1)、锁 Lock

      加锁,维护了数据的安全,但降低了程序的效率,但所有的效率都必须建立在数据安全的基础上;

      但凡涉及到并发编程我们都要考虑共享数据的安全性,我需要在并发部分对数据操作格外小心,

      如果涉及到数据的不安全就要加锁控制。

#  查票的例子
import os,time
from multiprocessing import Lock,Process
import json

def search(i):
    with open(‘db‘) as f:
        ticket_count = json.load(f)
        print(‘%s查到了还剩余:%s张余票!‘ % (i,ticket_count[‘count‘]))

def buy(i):
    with open(‘db‘) as f:
        ticket_count = json.load(f)
        time.sleep(0.2)     # 模拟请求数据库数据网络传输时延
    if ticket_count[‘count‘] > 0:
        ticket_count[‘count‘] -= 1
        print(‘%s号买到了车票!‘% i)
        time.sleep(0.2)     # # 模拟写入数据库数据网络传输时延
        with open(‘db‘, ‘w‘) as f:
            json.dump(ticket_count, f)

def get_ticket(lock, i):
    search(i)
    with lock: buy(i)
# 两种加锁方式
#
# def get_ticket(lock, i):
#     search(i) # 查票不用加锁,都可以查
#     lock.acquire()
#     buy(i) # 买票加锁
#     lock.release()

if __name__ == ‘__main__‘:
    lock = Lock()
    for i in range(10):
        p = Process(target=get_ticket,args=(lock,i))
        p.start()

查车票的例子

    lock内部实现进程间的通信,使得谁acquire了锁,谁realease了在多个拥有lock参数子进程中透明。

    2)、信号量 Semaphore 锁+计数器

      

# 4人KTV的例子

# def ktv(sema,i):
#     sema.acquire()
#     print(‘%s 走进ktv!‘ % i)
#     time.sleep(random.randint(1,5))
#     print(‘%s 走出KTV!!!‘% i)
#     sema.release()

def ktv(sema,i):
    with sema:
        print(‘%s 走进ktv!‘ % i)
        time.sleep(random.randint(1,5))
        print(‘%s 走出KTV!!!‘% i)

if __name__ == ‘__main__‘:
    sema = Semaphore(4)
    for i in range(10):
        p = Process(target=ktv, args=(sema, i))
        p.start()

4人KTV的例子

    3)、事件Event

       控制子进程阻塞还是执行的一个机制:

      wait方法:

        如果is_set() 标志位为False,则阻塞 wait(n)可以设置阻塞n秒后继续执行,但标志位不会改变,还是False

    如果is_set() 标志位为True,效果相当于pass

      控制标志:

        is_set():判断标志位状态

        set():设置标志位为True

        clear():设置标志位False

import time, random
from multiprocessing import Process,Event

e = Event()
# print(e.is_set()) 会打印12次,数数吧哈哈

def traffic_light(e):
    print(‘\033[1;31m红灯亮了\033[0m‘)
    while True:
        time.sleep(2)
        if e.is_set():
            print(‘\033[1;31m红灯亮了\033[0m‘)
            e.clear()
        else:
            print(‘\033[1;32m绿灯亮了\033[0m‘)
            e.set()

def car(e, i):
    if not e.is_set():
        print(‘car%s 在等待红灯‘ % i)
        e.wait()
    print(‘car%s 通过‘ % i)

if __name__ == ‘__main__‘:
    e = Event()
    traffic_light1 = Process(target=traffic_light, args=(e,))
    traffic_light1.daemon = True
    traffic_light1.start()
    li = []
    for i in range(10):
        p = Process(target=car, args=(e, i))
        p.start()
        li.append(p)
        time.sleep(random.randint(0, 3))
    for p in li:
        p.join()
    print(‘主程序结束!‘)

事件红绿灯的例子

  3.进程间的通信

    1.队列Queue

      # IPC 进程之间的通信

      empty():# 多进程的情况下 不准:

      full():# 多进程的情况下 不准:

      put():#队列慢 会引起程序的阻塞:

      get():#队列空 会引起程序的阻塞:

      put_nowait(): # 不会阻塞,但容易丢失数据

      get_nowait():# 不会阻塞,但满的话会报错

      

from multiprocessing import Process,Queue

def num(q,i):
    q.put({i:i**i})

if __name__ == ‘__main__‘:
    q = Queue()
    for i in range(10):
        p = Process(target=num, args=(q,i))
        p.start()

    for j in range(10):
        print(q.get())

利用Queue进行进程通信的例子

    2.管道

    3.Manager

  4.进程池

    pool

  

二、预习和扩展

原文地址:https://www.cnblogs.com/wuchenggong/p/9174688.html

时间: 2024-08-13 17:53:16

python全栈开发day32-进程创建,进程同步,进程间的通信,进程池的相关文章

Python 全栈开发【第一篇】:目录

Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基础语法入门 Python 全栈开发[第三篇]:数据类型.字符编码.文件操作 第二阶段:函数编程&常用标准库 Python 全栈开发[第四篇]:函数.递归.生成器.迭代器 Pyhton 全栈开发[第五篇]:常用模块学习 第三阶段:面向对象编程&网络编程基础 Python 全栈开发[第六篇]:面向对象

自学Python全栈开发第一次笔记

我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写了一份,哈哈哈...)我现在是准大学生,准备学习编程,日后做一个程序员,哈哈哈.听说程序员很苦逼,不过貌似挣得也很多啊.并且我貌似也只喜欢计算机这个方面,所以我想在这个行业发光. 前些天学习了一些Linux一些命令: pwd     查看你当前所在的目录  /root=计算机/E盘 /    是根目录 cd(ch

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

python全栈开发目录

python全栈开发目录 linux命令 初识python python基础数据类型 函数编程.set.深浅拷贝 内置函数 文件操作 装饰器 迭代器和生成器 常用模块 初识类和对象 类和对象(进阶) 反射 异常处理 socket.IO多路复用 线程.进程.协程 HTML CSS JavaScript DOM文档操作 jQuery实例 web框架本质 Tornado mysql基础 mysql进阶 ..... 基本算法 递归--二分法查找 冒泡排序 更多 线程池

Python全栈开发【基础四】

Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 匿名函数 lambda表达式:对于简单的函数,存在一种简便的表示方式,即lambda表达式 1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10)) 匿名函数主要是和其它函数搭配使用 举例: 1 ########

Python全栈开发【基础三】

Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 总结使用函数的好处: 1.减少代码重用 2.保持一致性,易维护

Python全栈开发【第一篇】:初识Python

Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与while循环练习题 基本数据类型前引 Python 的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jyhton Python的Java实现,Jython会将Pyth

Python全栈开发

Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理. 1.不带参数的装饰器 假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出start,函数运行后打印出end,要实现这样一个功能该怎么实现?看下面如何用

Python 全栈开发:python列表List

列表 列表是python中经常使用的数据类型,用于存放多个值. 表现形式:在[ ]内用逗号分隔,可以存放n个任意类型的值 eg: #单一类型 users=['yangli','yite','fixd'] #多类型,列表嵌套 users=['room01',['yangli',20,'音乐'],['yite',20,'篮球'],] 列表常用方法 和 函数 方法 函数 常用的操作 eg: len(list) #len(list) 计算列表的长度 ls = ['a','b','c','d'] leng