一.内容回顾

  并发和并行的区别

  并发

    宏观上是在同时运行的

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

    同一时刻只有一个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. [bash] 获取linux主机名,检视内中是否有特定字符串

    代码: #!/bin/bash hostname=$(hostname) #调用hostname命令获取主机名放入变量hostname中 #echo $hostname if [ `echo ${ho ...

  2. nginx模型概念和配置文件结构

    一. nginx模型概念: Nginx会按需同时运行多个进程: 一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程( ...

  3. 在 Windows 上安装 Composer

    a.去官网 getcomposer.org 下载安装程序 b.运行安装程序,需要开启三个扩展 openssl.curl.mbstring,没有开启的话 composer 也可以帮助开启:会自动将com ...

  4. 【python练习册】1.3 将1.2题生成的n个激活码保存到mysql关系型数据库中

    该题涉及到mysql中一些指令,先熟悉一下 MySQL指令 参考:https://www.cnblogs.com/zhuyongzhe/p/7686105.html mysql -u root -p ...

  5. python调用接口——requests模块

    前提:安装pip install requests 导入import requests 1.get请求   result=requests.get(url,d).json()  或  .text 2. ...

  6. python爬虫学习过程记录

    项目为爬取Python词条的信息. 项目代码在我的码云仓库. https://gitee.com/libo-sober/learn-python/tree/master/baike_spider 1. ...

  7. json出现引用 "$ref": "$.conpolice[2]"

    1. 出现这个问题一般是因为代码循环引用出现的问题,可以改变逻辑,也可以直接加上下面加粗的代码 JSONObject jsonObject = new JSONObject(); jsonObject ...

  8. java 泛型学习随笔

    对于java 泛型 编译时处理,运行时擦除的特点理解 对于编译时处理 在使用泛型相关的类或方法时,如果声明时的类型和具体使用时的类型不一致则直接会编译不通过 对于运行时擦除 当在运行时对两个相同类型但 ...

  9. GO练习题

    package main import( "fmt" ) func list(n int) { for i := 0; i <= n; i++ { fmt.Printf(&q ...

  10. 聊聊分布式下的WebSocket解决方案

    前言 最近王子自己搭建了个项目,项目本身很简单,但是里面有使用WebSocket进行消息提醒的功能,大体情况是这样的. 发布消息者在系统中发送消息,实时的把消息推送给对应的一个部门下的所有人. 这里面 ...