一.内容回顾

  并发和并行的区别

  并发

    宏观上是在同时运行的

    微观上是一个一个顺序执行

    同一时刻只有一个cpu在工作

  并行

    微观上就是同时执行的

    同一时刻不止有一个cpu在工作

  什么是进程

    一个运行中的程序就是一个进程

    是计算机中最小的资源分配单位

  什么是同步

    程序顺序执行,多个任务之间串行执行

  什么是异步

    多个任务同时运行

  IO操作

    input  输入到内存  read load recv accept recvfrom input

    output 从内存输出 write dump send connect sendto print

  什么是阻塞

    recv recvfrom accept

    程序由于不符合某个条件或者要等待某个条件满足在某一个地方进入等待状态

  什么是非租塞

    sk.setblocking(Fasle) 就让这个socket模型不阻塞了

二.今日内容

  multiprocessing是一个包

  Process类

    开启一个子进程

    能不能给子进程传递一个参数

    能不能有一个返回值

    主进程控制子进程的同步

    守护进程

    另一种开启子进程的方式

  Lock锁

    保证数据的安全性

  Semaphore 信号量

  Event 事件

三.进程模块

  1.开启了一个子进程就已经实现了并发: 父进程(主进程)和子进程并发(同时执行) 

def son_process():
print('son start')
time.sleep(1)
print('son end') if __name__ == '__main__':
p = Process(target=son_process)
p.start()
for i in range(5):
print('主进程')
time.sleep(0.3
主进程
主进程
son start
主进程
主进程
主进程
son end

  2.开启多个子进程

  

def son_process():
print('son start')
time.sleep(1)
print('son end') if __name__ == '__main__':
p1 = Process(target=son_process)
p1.start()
p2 = Process(target=son_process)
p2.start()
p3 = Process(target=son_process)
p3.start()
son start
son start
son start
son end
son end
son end
# 开启多个子进程(二)
def son_process():
print('son start')
time.sleep(1)
print('son end') if __name__ == '__main__':
for i in range(3):
p = Process(target=son_process)
p.start()
son start
son start
son start
son end
son end
son end
# 3.给子进程中传参数
def son_process(i):
print('son start',i)
time.sleep(1)
print('son end',i) if __name__ == '__main__':
for i in range(10):
p = Process(target=son_process,args=(i,))
p.start() # 通知操作系统 start并不意味着子进程已经开始了
# 4.主进程和子进程之间的关系
def son_process(i):
print('son start',i)
time.sleep(1)
print('son end',i) if __name__ == '__main__':
for i in range(10):
p = Process(target=son_process,args=(i,))
p.start()
print('主进程的代码执行完毕')
# 主进程会等待子进程结束之后才结束
# 父进程负责创建子进程,也负责回收子进程的资源
主进程的代码执行完毕
son start 3
son start 5
son start 4
son start 2
son start 0
son start 6
son start 7
son start 1
son start 9
son start 8
son end 3
son end 5
son end 4
son end 2
son end 0
son end 6
son end 7
son end 1
son end 9
son end 8
# 5.主进程不可以直接结束一个子进程
def son_process(i):
while True:
print('son start',i)
time.sleep(0.5)
print('son end',i) if __name__ == '__main__':
p = Process(target=son_process, args=(1,))
p.start() # 开启一个子进程,异步的
print('主进程的代码执行完毕')
print(p.is_alive()) # 子进程还活着
p.terminate() # 结束一个子进程,异步的
print(p.is_alive()) # 子进程还在活着
time.sleep(0.1)
print(p.is_alive())
# 6.进程之间数据隔离的概念
n = [100]
def sub_n():
global n # 子进程对于主进程中的全局变量的修改是不生效的
n.append(1)
print('子进程n : ',n)
if __name__ == '__main__':
p = Process(target = sub_n)
p.start()
p.join() # 阻塞 直到子进程p结束
print('主进程n : ',n)
子进程n :  [100, 1]
主进程n :  [100]
# 7.开启十个进程执行subn
# 主进程里的print('主进程n : ',n)这句话在十个子进程执行完毕之后才执行
n = [100]
import random
def sub_n():
global n # 子进程对于主进程中的全局变量的修改是不生效的
time.sleep(random.random())
n.append(1)
print('子进程n : ',n)
if __name__ == '__main__':
p_lst = []
for i in range(10):
p = Process(target = sub_n)
p.start()
p_lst.append(p)
for p in p_lst:p.join() # 阻塞 只有一个条件是能够让我继续执行 这个条件就是子进程结束
print('主进程n : ',n)
# 8.join的扩展
n = [100]
def sub_n():
global n # 子进程对于主进程中的全局变量的修改是不生效的
n.append(1)
print('子进程n : ',n)
time.sleep(10)
print('子进程结束') if __name__ == '__main__':
p = Process(target = sub_n)
p.start()
p.join(timeout = 5) # 如果不设置超时时间 join会阻塞直到子进程p结束
# timeout超时
# 如果设置的超时时间,那么意味着如果不足5s子进程结束了,程序结束阻塞
# 如果超过5s还没有结束,那么也结束阻塞
print('主进程n : ',n)
# p.terminate() # 也可以强制结束一个子进程

守护进程:
  什么是守护进程

  监控系统

  每隔1min中主动汇报当前程序的状态

import time
from multiprocessing import Process
def alive():
while True:
print('连接监控程序,并且发送报活信息') def func():
'主进程中的核心代码'
while True:
print('选择的项目')
time.sleep(0.5)
print('根据用户的选择做一些事儿') if __name__ == '__main__':
p = Process(target=alive)
p.daemon = True # 设置子进程为守护进程,守护进程会随着主进程代码的结束而结束
p.start()
time.sleep(5)
p = Process(target=func)
p.start()
# 设置子进程为守护进程,守护进程会随着主进程代码的结束而结束
# 由于主进程要负责给所有的子进程收尸,所以主进程必须是最后结束,守护进程只能在主进程的代码结束之后就认为主进程结束了
# 守护进程在主进程的代码结束之后就结束了,不会等待其他子进程结束

守护进程必须等待所有的子进程结束之后才结束

import time
from multiprocessing import Process
def alive():
while True:
print('连接监控程序,并且发送报活信息')
time.sleep(0.6) def func():
'主进程中的核心代码'
while True:
print('选择的项目')
time.sleep(1)
print('根据用户的选择做一些事儿') if __name__ == '__main__':
p = Process(target=alive)
p.daemon = True # 设置子进程为守护进程,守护进程会随着主进程代码的结束而结束
p.start()
p = Process(target=func)
p.start()
p.join() # 在主进程中等待子进程结束,守护进程就可以帮助守护其他子进程了

day39 Pyhton 并发编程02的更多相关文章

  1. day39 Pyhton 并发编程02 后

    一.开启子进程的另一种方式 import os from multiprocessing import Process class MyProcess(Process): def __init__(s ...

  2. 并发编程 02—— ConcurrentHashMap

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  3. python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程

    python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...

  4. C++并发编程 02 数据共享

    在<C++并发编程实战>这本书中第3章主要将的是多线程之间的数据共享同步问题.在多线程之间需要进行数据同步的主要是条件竞争. 1  std::lock_guard<std::mute ...

  5. python基础-并发编程02

    并发编程 子进程回收的两种方式 join()让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源 from multiprocessing import Process import ti ...

  6. Java并发编程(02):线程核心机制,基础概念扩展

    本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...

  7. day38 Pyhton 并发编程

    # 网络编程 # arp协议 : # 1.这是一个通过ip找mac地址的协议 # 2.由于有了socket,用户在使用网络的时候,只需要关心对方用户的ip地址就可以了 # 3.如果用户即将和这个ip进 ...

  8. day41 Pyhton 并发编程04

    内容回顾 socket 最底层的网络通信 所有的网络通信都是基于socket     进程 什么是进程? 是操作系统的发展过程中,为了提高cpu的利用率,在操作系统同时运行多个程序的时候,为了数据的安 ...

  9. day43 Pyhton 并发编程06

    一.内容回顾 线程 锁 为什么有了GIL之后还需要锁 多个线程同时操作全局变量还需要锁 当出现'非原子性操作',例如+= -= *= /= l.append(l) 原子性操作 a += 1  a= a ...

随机推荐

  1. find 用正则表达式查找符合yyyy-mm-dd-bddd模式的目录

    yyyy-dd-mm-bddd模式解释: yyyy:年份,如2020 mm:月份,如03 dd:日期,如22 -b:意为备份,-b为固定字符串 ddd:三位序列号,从001~999 符合此格式的目录名 ...

  2. 转载:Redis主从复制与高可用方案

    转载自: https://www.cnblogs.com/lizhaojun-ops/p/9447016.html 原文链接:http://gudaoyufu.com/?p=1230 redis主从复 ...

  3. composer 三大组成部分

    composer 三大组成部分:1. 仓库 2. 命令行下载器 3. 自动加载. 1. 仓库 公有仓库 https://packagist.org 私有仓库 https://packagist.com ...

  4. [程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)

    题意 给定一颗二叉树的头节点,已知所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这个树的头节点. 题解 在后序遍历过程中实现. 求解步骤按树形dp中所列步骤.可能性三种:左子树最大.右子 ...

  5. vue-ajax/axios请求函数封装: axios+promise

    项目文件目录/src/api ajax.js /** * ajax 请求函数模块 * 返回值为promise对象 */ import axios from 'axios' export default ...

  6. golang 指针类型学习

    对于指针类型不安全编程,通过指针值以及偏移量操作slice私有属性 // 通过指针值获取切片 func TestGetPrivate(t *testing.T) { s := []int{1, 2, ...

  7. Vue+Java+Base64实现条码解析

    前端部分(Vue + Vant) 引入Vant.使用Vant中的Uploader组件上传文件(支持手机拍照) import Vue from 'vue'; import { Uploader } fr ...

  8. 栈帧的内部结构--局部变量表(Local Variables)

    每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返 ...

  9. PHP绕过disable_function

    PHP绕过disable_function 常规绕过 exec exec执行command命令,但是不会输出全部结果,而是返回结果的最后一行. 想得到全部的结果,可以使用第二个参数,让其输出到一个数组 ...

  10. python中生成随机整数(random模块)

    1.从一个序列中随机选取一个元素返回:   random.choice(sep)    2.用于将一个列表中的元素打乱   random.shuffle(sep)    3.在sep列表中随机选取k个 ...