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个连接 请 ...
随机推荐
- 关于layui部分表单不显示的问题(Select, checkBox)
原因: 没有使用JS进行初始化 官方说明: https://www.layui.com/doc/base/faq.html layui.use('form', function(){ var form ...
- 基于spring-boot的测试桩设计-添加配置文件(properties)
编写测试时,有些内容可以放到配置文件中. 第一步:新增配置文件 conf.properties 第二步:编写配置文件类 MockConf package mock.mockdemo.conf; imp ...
- leetcode 21-30 easy
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
- php thrift TServerSocket实现端口复用
<?php namespace Message\Controller; use Think\Controller; use Thrift\Exception\TException; use Th ...
- 【JZOJ3295】【SDOI2013】泉(spring)
╰( ̄▽ ̄)╭ 济南市"泉历史研究小组"依据济南特有的泉脉关系将济南的泉水分为六个区域,分别是市中区.历下区.天桥区.槐荫区.历城区.长清区. 作为光荣的济南泉历史研究小组中的一员 ...
- Spring Boot → 09:使用外置Servlet容器_tomcat9.0
Spring Boot → 09:使用外置Servlet容器_tomcat9.0
- 【水滴石穿】mobx-todos
我觉得代码在有些程序员手里,就好像是画笔,可以创造很多东西 不要觉得创意少就叫没有创意,每天进步一点点,世界更美好 首先源码地址为:https://github.com/byk04712/mobx-t ...
- 工程没有生成lib文件,只生成了dll文件
解决办法: 在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便填写个名字 -> 添加 重新编译编译就可生成.li ...
- ES6 中字符串的扩展
1. 字符的Unicode表示法 JavaScript允许采用 \uxxxx 形式表示一个字符,其中 xxxx 表示字符的 Unicode 码点. "\u0061" // 表示小写 ...
- 带三角形下标的提示框(按钮button)
HTML:<div class="leaflet-popup-content-wrapper"> <div class="leaflet-popup-c ...