一、内容总结

  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

  

二、预习和扩展

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

  1. python全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

    昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...

  2. python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)

    昨日内容回顾 1.app播放音乐 plus.audio.createPlayer(文件路径/URL) player.play() 播放音乐 player.pause() 暂停播放 player.res ...

  3. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

  4. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

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

           我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...

  6. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  7. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  8. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  9. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

随机推荐

  1. LL(1)文法分析表的构造和分析过程示例

    在考完编译原理之后才弄懂,悲哀啊.不过懂了就好,知识吗,不能局限于考试. 文法: E→TE' E'→+TE'|ε T→FT ' T'→*FT'|ε F→id| (E) 一.首先判断是不是 LL(1)文 ...

  2. Hibernate_day02

    一.今天内容 1 实体类编写规则 2 hibernate主键生成策略 (1)native (2)uuid 3 实体类操作 (1)crud操作 (2)实体类对象状态 4 hibernate的一级缓存 5 ...

  3. Ubuntu下提示U盘没有权限--只能读不能写

    在Windows下,U盘能够正常地读写文件(能复制粘贴),但发现有个文件打不开.然后在Linux下,对U盘只能读不能写.提示:Read only system. 参考:https://bugs.lau ...

  4. Java入门系列(十二)Java反射

    Why--指的是为什么做这件事,也既事物的本质. 反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  5. C#复杂类型序列化

    [Serializable] public class CardItemInfo { private int lineWidth;//线宽 private CardItemInfo childCard ...

  6. luogu P1053 篝火晚会

    传送门 首先如果题目的目标状态不是一个环就不合法 然后先把这个环搞出来,然后每个位置上的数对这个数对应的位置连边,可以发现有若干个环,而只要对这些环执行操作就好了,答案上界显然是\(n\).然后,如果 ...

  7. CF875F Royal Questions

    传送门 似乎可以按边权排序后二分图匹配 这里给一个复杂度稳定的算法 把一个公主能匹配的两个点连边,然后依次加边,每当加到一个大小为\(n\)的连通块中有\(n\)条边之后,这时形成了基环树,将这些边定 ...

  8. Ball CodeForces - 12D (线段树)

    题目链接:https://cn.vjudge.net/problem/CodeForces-12D 题目大意:给你一个人的三个信息,如果存在一个人比当前人的这三个信息都大,那么这个人就会退出,问你最终 ...

  9. windows cmd相关操作

    一:文件夹1. 新建文件夹方式一:md[盘符:\][路径\]新目录例如:md c:\test\newtest 方式二:先使用cmd进入需要新建文件的根目录下,使用md或者mkdir 直接创建文件夹ne ...

  10. 【Udacity并行计算课程笔记】- Lesson 2 The GPU Hardware and Parallel Communication Patterns

    本小节笔记大纲: 1.Communication patterns gather,scatter,stencil,transpose 2.GPU hardware & Programming ...