同步与异步

用来表达任务的提交方式

同步
提交完任务之后原地等待任务的返回结果,期间不做任何事情
异步
提交完任务后 然后去做其他事情,等这个任务完成了再过来 CUP处理程序的2种方法

阻塞与非阻塞

用来表达任务的执行状态

阻塞
阻塞态
非阻塞
就绪态,运行态

综合使用

同步阻塞
同步非阻塞
异步阻塞
异步非阻塞
# 这是CPU利用率最高,效率最高的运行方式

创建进程的多种方式

关键词 multiprocessing 模块 Process

from multiprocessing import Process
import time def task(name):
print('来自task', name)
time.sleep(3)
print('over', name) if __name__ == '__main__':
p1 = Process(target=task,args=('name',))
# 创建异步子进程对象 执行程序为task,传入位置参数args=('name',)必须已远足方式传参
p2 = Process(target=task,kwargs={'name1':'moon'})
# 传家异步子进程对象,执行程序为task,关键字传参法kwargs=,必须已字典形式传参
p1.start()
print('主要') '''
当程序运行到 子进程 进行时 会创立一个单独空间去运行子程序,不影响主程序运行 主程序会接着运行
主要
来自task moon
over moon
''' 方式二: class MyProcess(Process):
# 创建一个类,继承Process的所有内容
def __init__(self,name,age):
super().__init__()
# 调用父类的信息 新增内容
self.name = name
self.age = age def run(self):
print('来自子程序',self.name,self.age) if __name__ == '__main__':
obj = MyProcess('moon',18)
obj.start()
print('主') '''
面向对象思想。创建类 生产对象调用子进程
'''

进程间数据隔离

同一台计算机上的多个进程数据是严格意义上的物理隔离的,默认情况下

from multiprocessing import Process
import time m1 = 1000 def run():
global m1
m1 = 666
print(m1) if __name__ == '__main__':
p1 = Process(target=run,)
p1.start()
time.sleep(2)
# 子进程已经执行结束了,正常m1应该被重复赋值了
print(m1)
# 1000 但是结果是没有,因为子进程数据独立,不影响主进程数据

进程join方法

1.什么是join方法
可以是控制为子进程在运行完成后再进行主进程 from multiprocessing import Process
import time def tack():
print('我是子进程')
time.sleep(3)
print('等待2秒') def tack1():
print('我是子进程2')
time.sleep(6)
print('等待3秒2') if __name__ == '__main__':
start_time = time.time()
p1 = Process(target=tack,)
p2 = Process(target=tack1,)
p1.start()
# 子进程开始进行
p2.start()
# 子进程开始进行
p1.join()
# 子进程需要3秒运行结束
p2.join()
# 在等待p1时 p2也在进行中
print('主进程')
# 因为使用了join方法,主进程需要等对应的子进程运行结束才可以执行
print(time.time() - start_time)
# 所以最用用时为 6秒 而不是 6+3=9 # p.start() # 异步
'''主进程代码等待子进程代码运行结束再执行'''
# p.join()
# print('主')

IPC机制

IPC:进程间通信
消息队列:所有线程程序都可以存,也都可以取 (队列:先进先出) 关键词 Queue from multiprocessing import Queue Q = Queue(3)
# 类产生一个对象(消息队列),括号内是可以设定贮存数据的最大额度 Q.put(111)
Q.put(222)
# put 可以向队列中添加数据
# 如果存满了也会挺着 等待到能存进去为止 print(Q.full())
# full 可以判断队列数据是否已满 返回布尔值 print(Q.get())
# get 可以向队列中取值 队列默认先进先出原则
# 如果取不到会挺着 等待取到为止 也不报错 print(Q.get(timeout = 3))
# 等待3秒 如果还取不到就报错 print(Q.get_nowait())
# get_nowait 向队列中取值,立即就要 取不到就报错 print(Q.empty())
# empty 判断队列是否为空 返回布尔值 可以配合捕捉错异常
try:
print(q.get(timeout=3))
# 如果取不到值3秒后会报错
except Exception as e:
print('队列中暂无数据') """
full() empty() get_nowait()在多进程中都不能使用!!!
因为在多线程情况下可能出现同时间的存取
"""

生产者消费者模型

只是一个编程思维概念
举例:爬虫工程师 生产者:
负责生产数据的人,把你需要的数据都给你 消费者:
负责处理数据的人,拿到提供的数据然后二次加工 该模型除了有生产者和消费着之外还必须有消息队列(只要是能提供数据保存服务和提取服务的理论上都可以)

进程对象的多种方法

'''
一台计算机上的每一个进程都会有自己的PID号,也就是进程号
如何查看进程号:
windows电脑 cmd输入 tasklist 命令 即可查看所有
mac电脑 终端输入 ps aux
''' from multiprocessing import Process,current_process
import time
import os def task():
print(current_process().pid)
# 查看当前子进程号
print(os.getpid())
# 查看当前子进程号
time.sleep(5) if __name__ == '__main__':
p = Process(target=task)
p.start()
p.terminate() # 杀死这个进程
time.sleep(0.1)
print(p.is_alive()) # 查看进程是否存活
# print('主',current_process().pid)
print('主',os.getpid())
# 查看当前主进程号
print('主主',os.getppid())
# 查看当前主进程号父级号 # os.getpid()
# current_process().pid
# # 这两个方法都是查看当前所在进程下的pid号码
# os.getppid()
# # 这个是查看当前进程的父进程pid号码

僵尸进程与孤儿进程

僵尸进程
进程执行完毕后并不会立刻销毁所有数据 会有一些信息短暂保留下来
比如 进程号进程执行时间, 进程耗费功力等给父进程查看
父进程等待子进程运行结束,回收进程号
ps:所有的进程在关闭时都会有一段时间为僵尸进程,在僵尸进程期间
进程号不释放 孤儿进程
子进程正常运作,父进程意外死亡
操作系统针对孤儿进程会派遣福利院管理

守护进程

from multiprocessing import Process
import time # 关键词 .daemon 守护进程 def task(name):
print('活着',name)
time.sleep(3)
print('死去',name) if __name__ == '__main__':
p = Process(target=task,args=('moon',))
# p = Process(target=task,kwargs={'name':'moon'})
p.daemon = True
# 将子进程 P 设置成为守护进程
# 必须要在子进程开始前设置好
p.start()
print('主进程结束')

多线程实现TCP服务端并发

服务端:

import socket
from multiprocessing import Process def talk(sock):
while True:
msg = sock.recv(1024)
print(msg.decode('utf8'))
sock.send(msg.upper()) if __name__ == '__main__':
server = socket.socket()
server.bind(('192.168.1.99', 8888))
# 确保次代码不能循环,因为地址只能绑定一次
server.listen(5)
while True:
#循环创建子进程
print('等待连接中...')
sock, addr = server.accept()
print(f'用户:{addr[0]}已接入')
p = Process(target=talk, args=(sock,))
# 创建子进程 异步处理
p.start() '''
循环创建子进程进行接收 对话 每创建一个子进程后 再次进入等待接入状态
''' 客户端: import socket client = socket.socket()
client.connect(('192.168.1.99', 8888)) while True:
my_msg = input('请输入您要发送的内容')
client.send(my_msg.encode('utf8'))
msg = client.recv(1024)
print(msg.decode('utf8'))

多进程TCP服务端并发- 进程join方法 - IPC机制的更多相关文章

  1. 进程池与线程池、协程、协程实现TCP服务端并发、IO模型

    进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度 ...

  2. 8.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q

    TCP服务端支持并发 解决方式:开多线程 服务端 基础版 import socket """ 服务端 1.要有固定的IP和PORT 2.24小时不间断提供服务 3.能够支 ...

  3. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  4. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  5. python GIL全局解释器锁,多线程多进程效率比较,进程池,协程,TCP服务端实现协程

    GIL全局解释器锁 ''' python解释器: - Cpython C语言 - Jpython java ... 1.GIL: 全局解释器锁 - 翻译: 在同一个进程下开启的多线程,同一时刻只能有一 ...

  6. 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发

    子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...

  7. GIL全局解释锁,死锁,信号量,event事件,线程queue,TCP服务端实现并发

    一.GIL全局解释锁 在Cpython解释器才有GIL的概念,不是python的特点 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势. 1.GIL介绍 ...

  8. TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q

    TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q 一.TCP协议下的服务端并发 ''' 将不同的功能尽量拆分成不同的函数,拆分出来的功能可以被多个地方使用 TCP服务 ...

  9. TCP服务端开发为例--web开发不同url请求走不同control方法

    拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...

  10. python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03

    目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...

随机推荐

  1. MySQL一致性读原来是有条件的

    众所周知,在设定了隔离等级为Repeatable Read及以上时,InnoDB 可以实现数据的一致性读.换句话来说,就是事务执行的任意时刻,读取到的数据是同一个快照,不会受到其他事务的更新影响. 以 ...

  2. AlertManager 之微信告警模板,UTC时间错8个小时的解决办法

    注意事项: alertmanager中的web页面显示的报警时间是UTC时间,错8个小时,企业微信报警模板中已经修改过来了 下面配置可以作为参考: 1.prometheus操作 1.1 配置告警规则, ...

  3. WPF 的内部世界(控件与布局)

    目录 一.控件与布局 前言 为什么要写WPF呢? 我一开始算是比较抵触WPF的,因为用的人少吗.感觉都是窗体应用能和Winform有什么区别.可是我错了,非常感谢我的讲师,给我推荐刘铁猛的<深入 ...

  4. jq修改多个css样式

    $("#xxx").css({"属性名称": "属性值", "属性名称": "属性值" });

  5. 2022.9.30 Java第四次课后总结

    1.public class BoxAndUnbox { /** * @param args */ public static void main(String[] args) { int value ...

  6. day09-1存储引擎

    存储引擎 1.基本介绍 基本介绍 MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM.innoDB.Memory等 MySQL数据表主要支持六种类型,分别是:CS ...

  7. 我用canvas带你看一场流星雨

    前言 最近总是梦见一些小时候的故事,印象最深刻的就是夏天坐在屋顶上,看着满天的繁星,一颗,两颗,三颗...不由自主地开始了数星星的过程.不经意间,一颗流星划过夜间,虽然只是转瞬即逝,但它似乎比夜空中的 ...

  8. Linux中CentOS 7版本安装JDK、Tomcat、MySQL、lezsz、maven软件详解

    软件安装 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式 特点 二进制发布包安装 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 rpm安装 软件已经按照 ...

  9. 45.限流Throttling及源码解析

    什么是限流? 限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率 假设有客户端(比如爬虫程序)短时间发起大量请求,超过了服务器能够处理的能力 ...

  10. HTML5和CSS3新特性

    1.HTML5新标签和属性 1.1 兼容性前缀与语义化 兼容低版本的写法.比较新的浏览器,可以直接写.兼容性前缀,是每个浏览器私有的. 内核 兼容性前缀 浏览器 Gecko -moz- Firefox ...