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个连接 请 ...
随机推荐
- 纪念——代码首次达到近50K(更新:78.8K 2019行)
#include<bits/stdc++.h> #define re register #define F(A) for(re int (A)=1;(A)<=8;++(A)) usi ...
- 前言-使用Eclipse创建SpringBoot项目
1.首先我们需要安装STS插件:Help--> Eclipse Marketplace 2. 然后 File-->New--->Spring Starter Project 3.下 ...
- wpf样式与行为
- Wireless Network POJ - 2236 (并查集)
#include<iostream> #include<vector> #include<string> #include<cmath> #includ ...
- 使用tomcat部署多个站点,访问时当然不能带上下文路径咯
参考 http://blog.sina.com.cn/s/blog_6341fc0f0100lzaj.html tomcat的server.xml文件(比如C:\Program Files\Apach ...
- storm 为什么要存在不透明分区事务
不透明分区事务不区分发新消息还是旧消息,全部用emitPartitionBatch搞定,虽然 emitPartitionBatch返回的X应该是下一批次供自己使用(emitPartitionBatch ...
- python实例 字典
#! /usr/bin/python x={'a':'aaa','b':'bbb','c':12} print (x['a']) print (x['b']) print (x['c']) for k ...
- Leetcode657.Robot Return to Origin机器人能否返回原点
在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串表示.字符 move[i] 表示其第 i 次移动.机器 ...
- PHP 学习1.0
1.简单一个class 类: 获取表单提交的值 采用post方式 <html><head><title>PHP TEST</title></hea ...
- Javascript面向对象编程(四):非构造函数的继承
什么叫非构造函数的继承? 比如,现在有一个对象,叫做"中国人". var Chinese = { nation:'中国' }; 还有一个对象,叫做"医生". v ...