复习

# 信号量
from multiprocessing import Semaphore
# 用锁的原理实现的,内置了一个计数器
# 在同一个事件,只能有指定数量的进程执行某一段被控制住的代码
# 事件
# wait阻塞受到事件控制的同步组件
# 状态 True Flase is_set
# true--》false 用clear()
# false --->true 用set()
# wait方法 状态为true不阻塞 状态为false的时候阻塞 # 队列
# Queue
# put 当队列满的时候阻塞等待队列有空位置
# get 当队列空的时候阻塞等待队列有数据
# full empty 不完全准确 # JoinableQuere
# task_done 与get连用
# join 与put连用

管道

from multiprocessing import Pipe,Process
def func(conn1,conn2):
conn2.close()
while True:
try:
msg = conn1.recv()
print(msg)
except EOFError:
conn1.close()
break if __name__ == '__main__':
conn1,conn2 = Pipe()
Process(target=func,args=(conn1,conn2)).start()
conn1.close()
for i in range(20):
conn2.send('吃了吗')
conn2.close()
from multiprocessing import  Pipe,Process
import time,random
def producer(con,pro,name,food):
con.close()
for i in range(4):
time.sleep(random.randint(1,3))
f = '%s生产%s%s'%(name,food,i)
print(f)
pro.send(f)
pro.close()
def consumer(con,pro,name):
pro.close()
while True:
try:
food = con.recv()
print('%s吃了%s'%(name,food))
time.sleep(random.randint(1,3))
except EOFError:
con.close()
break
if __name__ == '__main__':
con,pro = Pipe()
p = Process(target=producer,args = (con,pro,'egon','泔水'))
p.start()
c = Process(target=consumer,args = (con,pro,'alex'))
c.start()
con.close()
pro.close()
进程之间的数据共享
from multiprocessing import  Manager,Process,Lock

def main(dic,lock):
lock.acquire()
dic['count'] -= 1
lock.release() if __name__ == '__main__':
m = Manager()
l = Lock()
dic = m.dict({'count':100})
p_list = []
for i in range(50):
p = Process(target=main,args=(dic,l))
p.start()
p_list.append(p)
for i in p_list: i.join()
print('主进程:',dic)

进程池

# 为什么有进程池
# 效率
# 每开启进程,开启属于这个进程的内存空间
# 寄存器 堆栈 文件
# 进程过多,操作系统调度进程
# 进程池
# python中的先创建一个属于进程的池子
# 这个池子指定能存放多少个进程
# 先将这些进程创建好
from multiprocessing import Pool
import os,time
def func(n):
print('start func%s'%n,os.getpid())
time.sleep(1)
print('end func%s'%n,os.getpid())
if __name__ == '__main__':
p = Pool(5)
for i in range(10):
p.apply_async(func,args=(i,))
p.close() #结束进程池接受任务
p.join() #感知进程池中的任务执行结束

socket_server-进程池

#server
import socket
from multiprocessing import Pool def func(conn):
conn.send(b'hello')
print(conn.recv(1024).decode('utf-8'))
conn.close()
if __name__ == '__main__':
p = Pool(5)
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
while True:
conn,addr = sk.accept()
p.apply_async(func,args=(conn,))
sk.close()
#client
import socket sk = socket.socket()
sk.connect(('127.0.0.1',8080))
ret = sk.recv(1024).decode('utf-8')
print(ret)
msg = input('>>>').encode('utf-8')
sk.send(msg)
sk.close()

进程池返回值

# p.map(funcname,iterable)  默认异步的执行任务,自带close和join
# p.apply 同步调用
# p.apply_async 异步调用 和主进程完全异步 需要手动close和join
from multiprocessing import Pool
def func(i):
return i*i if __name__ == '__main__':
p = Pool(5)
for i in range(10):
res = p.apply(func,args=(i,)) #apply的结果就是func的返回值
print(res)
import time
from multiprocessing import Pool
def func(i):
time.sleep(0.5)
return i*i if __name__ == '__main__':
p = Pool(5)
res_list = []
for i in range(10):
res = p.apply_async(func,args=(i,)) #
res_list.append(res)
for res in res_list:print(res.get())
#map
import time
from multiprocessing import Pool
def func(i):
time.sleep(0.5)
return i*i if __name__ == '__main__':
p = Pool(5)
ret = p.map(func,range(10))
print(ret) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

进程池的回调函数

from multiprocessing import Pool

def func1(n):
print('in func1')
return n*n
def func2(nn):
print('in func2')
print(nn) if __name__ == '__main__':
p = Pool(5) p.apply_async(func1,args=(10,),callback=func2)
p.close()
p.join()

in func1
in func2
100

 
from multiprocessing import Pool
import os
def func1(n):
print('in func1',os.getpid())
return n*n
def func2(nn): #参数只能是func1的返回值
print('in func2',os.getpid())
print(nn) if __name__ == '__main__':
print('主进程: ',os.getpid())
p = Pool(5) p.apply_async(func1,args=(10,),callback=func2)
p.close()
p.join() 主进程: 11172
in func1 11760
in func2 11172
100

Python9-进程池-day38的更多相关文章

  1. python--9、进程池

    concurrent.futures模块 进程池中的进程是固定的,若是池中有任务结束后,等待的任务进来后由空闲的进程来处理. 导入方法三连发: from 标题的模块 import 如下:Process ...

  2. python进程池:multiprocessing.pool

    本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...

  3. 64位进程池HashCode兼容处理

    背景 net旧项目使用32位生成的HashCode,存储到数据库中.迁移到64位上,就需要对HashCode做兼容处理. 解决方案 1:进程池配置支持32位程序. 2:对Hashcode做兼容处理,[ ...

  4. Linux客户/服务器程序设计范式2——并发服务器(进程池)

    引言 让服务器在启动阶段调用fork创建一个子进程池,通过子进程来处理客户端请求.子进程与父进程之间使用socketpair进行通信(为了方便使用sendmsg与recvmsg,如果使用匿名管道,则无 ...

  5. PYTHON多进程编码结束之进程池POOL

    结束昨晚开始的测试. 最后一个POOL. A,使用POOL的返回结果 #coding: utf-8 import multiprocessing import time def func(msg): ...

  6. python(进程池/线程池)

    进程池 import multiprocessing import time def do_calculation(data): print(multiprocessing.current_proce ...

  7. python进程池剖析(三)

    之前文章对python中进程池的原理.数据流以及应用从代码角度做了简单的剖析,现在让我们回头看看标准库中对进程池的实现都有哪些值得我们学习的地方.我们知道,进程池内部由多个线程互相协作,向客户端提供可 ...

  8. python进程池剖析(二)

    之前文章中介绍了python中multiprocessing模块中自带的进程池Pool,并对进程池中的数据结构和各个线程之间的合作关系进行了简单分析,这节来看下客户端如何对向进程池分配任务,并获取结果 ...

  9. python进程池剖析(一)

    python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...

  10. python多进程,以及进程池并发

    模拟多进程 #!/usr/bin/env python#-*- coding:utf-8 -*-import timefrom multiprocessing import Process def s ...

随机推荐

  1. 查询索引range失效

    在某一个时间字段加索引,短的时间范围内查询,索引生效,为range.长时间范围,索引失效,查全表. 当索引查的数据量超过全表30%的数据,索引失效,会查全表.

  2. spring boot Filter过滤器的简单使用

    springboot使用Filter过滤器有两种方式: 一种是实现Filter接口然后通过@Component注解向项目加入过滤器 另一种是通过配置类来配置过滤器 @Component public ...

  3. pixhawk 固件Firmware内执行make px4fmu-v2_default 编译报错解决办法

    执行下列指令报错 make px4fmu-v2_default /bin/sh: 1: Tools/check_cmake.sh: Permission denied Makefile:44: Not ...

  4. Angular 路由route实例

    iSun Design & Code AngularJS - 路由 routing 基础示例 AngularJS 路由 routing 能够从页面的一个视图跳转到另外一个视图,对单页面应用来讲 ...

  5. check设置默认值但刷新后就会清空

    关于check设置默认值但刷新后就会清空的问题 可能是由于浏览器的问题 我这边就直接在ComponentDidMount里面加jq使得该radio的状态为选中,后边还发现一个问题就是在点击的时候多次点 ...

  6. BZOJ4299: Codechef FRBSUM(主席树)

    题意 题目链接 数集S的ForbiddenSum定义为无法用S的某个子集(可以为空)的和表示的最小的非负整数. 例如,S={1,1,3,7},则它的子集和中包含0(S’=∅),1(S’={1}),2( ...

  7. pc端常见布局---水平居中布局 单元素不定宽度

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector

    题目描述 Bessie the cow, always a fan of shiny objects, has taken up a hobby of mining diamonds in her s ...

  9. WCFSVC文件的分离

    项目结构图如下: 新建一个实现内容和接口的项目: 接口内部如下: using DataModel; using System; using System.Collections.Generic; us ...

  10. jquery的uploadify插件实现的批量上传V3.2.1版

    你需要如下配置(包括引入文件)HTML: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&quo ...