9-1进程,进程池和socketserver
一 进程:
# 什么是进程 : 运行中的程序,计算机中最小的资源分配单位
# 程序开始执行就会产生一个主进程
# python中主进程里面启动一个进程 —— 子进程
# 同时主进程也被称为父进程
# 父子进程之间的代码执行是异步的,各自执行自己的
# 父子进程之间的数据不可以共享
# 主进程会等待子进程结束之后再结束 二例子
#开启一个子进程
import os
import time
from multiprocessing import Process
def func(num):
print(num,os.getpid())
time.sleep(0.5)
print(num,os.getpid())
time.sleep(0.5)
if __name__ == '__main__':
p=Process(target=func,args=(10,))
p.start()
print(os.getpid(),0)
time.sleep(1)
print(os.getpid(),1)
##父进程和子进程数据不可以共享,打印n为100
n=100
def func():
global n
n=0
print('------')
time.sleep(3)
if __name__ == '__main__':
Process(target=func).start()
time.sleep(1)
print(n) 结果:打印n为100
#开启多个子进程
def func(n):
time.sleep(1)
print('_'*n)
if __name__ == '__main__':
l=[]
for i in range(10):
p=Process(target=func,args=(i,))
p.start()
l.append(p) print('子进程开始了')
for p in l:p.join()
print('10条信息已经发送完毕')
#守护进程
# 守护进程也是一个子进程
# 当主进程的代码执行完毕之后自动结束的子进程叫做守护进程
#当主进程结束的时候守护进程才结束
例子一:
def deamon_func(): #守护进程
while True:
print('我还活着')
time.sleep(0.5)
def wahaha():#子进程
for i in range(10):
time.sleep(1)
print(i*'#')
if __name__ == '__main__':
p2=Process(target=wahaha)
p2.start()
p=Process(target=deamon_func) #守护进程
p.daemon=True
p.start()
for i in range(3): #主进程
print(i*'*')
time.sleep(1)
当主进程执行完之后,deamon_func也就停止打印了
def deamon_func():
while True:
print('我还活着')
time.sleep(0.5)
def wahaha():
for i in range(10):
time.sleep(1)
print(i*'#')
if __name__ == '__main__':
p2=Process(target=wahaha)
p2.start()
p=Process(target=deamon_func) #这个是守护进程
p.daemon=True
p.start()
for i in range(3): #主进程
print(i*'##')
time.sleep(1)
p2.join() 这个是当wahaha里面的执行完毕了,守护进程才结束
总结
# 开启一个子进程 start
# 子进程和主进程是异步
# 如果在主进程中要等待子进程结束之后再执行某段代码:join
# 如果有多个子进程 不能在start一个进程之后就立刻join,把所有的进程放到列表中,等待所有进程都start之后再逐一join
# 守护进程 —— 当主进程的"代码"执行完毕之后自动结束的子进程叫做守护进程
二 进程池
#提交任务的两种方式:
#同步调用:提交完任务后,就在原地等待,等待任务执行完毕,拿到任务的返回值,才能继续下一行代码,导致程序串行执行
#异步调用+回调机制:提交完任务后,不在原地等待,任务一旦执行完毕就会触发回调函数的执行, 程序是并发执行
#异步调用 1 from concurrent.futures import ProcessPoolExecutor
def task(n):
print('%s is runing'%os.getpid())
time.sleep(random.randint(1,3))
return n**2
def handle(res):
res=res.result()
print('handle res %s' %res)
if __name__ == '__main__':
pool=ProcessPoolExecutor(2) #开启2个进程,每次执行2个
for i in range(5):
obj=pool.submit(task,i)
obj.add_done_callback(handle) pool.shutdown()
print('主') 打印结果:12800 is runing
6264 is runing
6264 is runing
handle res 1
12800 is runing
handle res 0
6264 is runing
handle res 4
handle res 16
handle res 9
主
#同步调用,从上到下依次执行
1 from concurrent.futures import ProcessPoolExecutor
def task(n):
print('%s is runing'%os.getpid())
time.sleep(random.randint(1,3))
return n**2
def handle(res):
print('handle res %s' %res)
if __name__ == '__main__':
pool=ProcessPoolExecutor(3)
for i in range(5):
res=pool.submit(task,i).result()
handle(res)
pool.shutdown()
print('主') 执行结果:
16128 is runing
handle res 0
17120 is runing
handle res 1
7060 is runing
handle res 4
16128 is runing
handle res 9
17120 is runing
handle res 16
主
三 socketserver(用的就是多进程)
服务端:
import time
import socketserver
class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
print(conn)
time.sleep(3)
conn.send(b'hello')
time.sleep(5)
conn.send(b'hello2')
# socketserver
# socket myserver = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver)
myserver.serve_forever() # socketserver所启动的服务端是不能有input操作的
# server端一般都是根据client端的要求去执行固定的代码
客户端:
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',9000))
print(sk.recv(1024))
print(sk.recv(1024))
sk.close()
9-1进程,进程池和socketserver的更多相关文章
- 并发编程(六)--进程/线程池、协程、gevent第三方库
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
- 并发编程中死锁、递归锁、进程/线程池、协程TCP服务器并发等知识点
1.死锁 定义; 类似两个人分别被囚禁在两间房子里,A手上拿着的是B囚禁房间的钥匙,而B拿着A的钥匙,两个人都没法出去,没法给对方开锁,进而造成死锁现象.具体例子代码如下: # -*-coding:u ...
- python语法基础-并发编程-进程-进程理论和进程的开启
############################################## """ 并发编程的相关概念: 进程 1,运行中的程序,就是进程,程序是没有生 ...
- 1.Linux进程--进程标识号
函数原型 pid_t fork(void); fork的奇异之处在于它被调用一次,却返回两次,它可能有三种不同的返回值: 1.在父进程中.fork返回新创建的子进程的PID 2.在子进程中,fork返 ...
- Operating System-Process(1)什么是进程&&进程的创建(Creation)&&进程的终止(Termination)&&进程的状态(State)
本文阐述操作系统的核心概念之一:进程(Process),主要内容: 什么是进程 进程的创建(Creation) 进程的终止(Termination) 进程的状态(State) 一.什么是进程 1.1 ...
- python之进程(池)
获得进程id import osfrom multiprocessing import Process def info(title): print(title) print('模块名:',__nam ...
- 进程&进程池
进程 服务器中, s.listen(n) n不能无限大,以为内存不可能无限大,n表示内存同一时间接纳的等待连接数,可以看成一个(队列),取出一个拿去建立连接,然后再放进一个,队列中一直保持n个连接 请 ...
随机推荐
- 关于CE的反思
当你注视着你的分数, 眼眶倏地猛睁. 不会做的题血红一片, 认真做了的题一点墨蓝. 你知道, 你CE了, 你挂了, 你倒数第一了, 你当场去世了. 两小时的努力付诸东流, 线段树的碎片历历在目. 思考 ...
- Shell 常用特性
管道(|) 管道 (|): 将一个命令的输出作为另外一个命令的输入. 管道同样可以在标准输入输出和标准错误输出间做代替工作,这样一来,可以将某一个程序的输出送到另一个程序的输入,其语法如下: ...
- nyoj zb的生日【背包型DFS/选or不选】
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么 ...
- Ocelot(二)- 请求聚合
原文:Ocelot(二)- 请求聚合 Ocelot(二)- 请求聚合与负载均衡 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/ ...
- python基础--文件开发目录规范
bin start.py 主要是放着当前项目的启动文件 conf settiings.py 放着对当前文件的配置文件 core src.py 主要核心逻辑 db 数据存储文件 lib common.p ...
- rpmnew和rpmsave怎么来的
RPM spec文件有个名为 %config 的宏,它可以标识配置文件,这样在升级时用户对配置文件做过的修改就不会丢失.没有它,用户千辛万苦修改过的配置文件会在升级过程中被覆盖. %config也可以 ...
- 2019-10-18-WPF-解决-StylusPlugIn-点击穿透问题
title author date CreateTime categories WPF 解决 StylusPlugIn 点击穿透问题 lindexi 2019-10-18 20:55:35 +0800 ...
- 001. 注释过的boot.s
从网上搜罗一个很详细注释的boot.s版本,加了小小一点点自己的理解,不太多. 用 as86, ld86 可以编译, ubuntu下可以通过 apt install bin86 来安装好像. ; ...
- redis数据库基本使用
redis数据库 # 1.安装redis与可视化操作工具 # 选择安装路径.圈中默认配置环境变量 # 2.在服务中管理redis服务器的开启关闭 # 3.命令行简单使用redis: -- redis- ...
- 获得CSM(Certified Scrum Master)-价值驱动交付。
2019年越来越多的企业开始实行敏捷转型,紧随时代潮流,学习最先进的科学管理方法,找到正确的人(团队),为企业交付高价值的产品服务. 导师Ethan ,培训的课程让人收益匪浅,活到老学到老,丰富的知识 ...