复习

# 信号量
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. Netty-flush

    TimerServer: ch.pipeline().addLast(new TimeEncoder()); ch.pipeline().addLast(new TimeServerHandler() ...

  2. DotNetAnywhere

    DotNetAnywhere:可供选择的 .NET 运行时   原文 : DotNetAnywhere: An Alternative .NET Runtime作者 : Matt Warren译者 : ...

  3. NET Core中使用Irony

    在.NET Core中使用Irony实现自己的查询语言语法解析器   在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建 ...

  4. 049 Group Anagrams 字谜分组

    给定一个字符串数组,将相同字谜组合在一起.(字谜是指颠倒字母顺序而成的字)例如,给定 ["eat", "tea", "tan", " ...

  5. 企业级Web Nginx 服务优化

    企业级Web Nginx 服务优化 http://blog.51cto.com/search/result?q=%E4%BC%81%E4%B8%9A%E7%BA%A7Web+Nginx+%E6%9C% ...

  6. 使用SharePreferences存取数据(慕课笔记 )

    0.视频地址:http://www.imooc.com/video/3265 1.使用SharePreferences存取数据: public class MainActivity extends A ...

  7. pytest+allure2+jenkins环境部署

    1.pycharm安装allure-pytest 2.jenkins -> 系统管理 -> 插件管理 -> 可选插件中过滤Allure,勾选对应插件安装 如下图:  3.安装完插件后 ...

  8. 洛谷 U3348 A2-回文数

    题目背景 方方方很喜欢回文数,于是就有了一道关于回文数的题目. 题目描述 求从小到大第n(1<=n<=10^18)个回文数. 注释:出题人认为回文数不包括0. 输入输出格式 输入格式: 一 ...

  9. 爬去酷狗top500的数据

    import requests from bs4 import BeautifulSoup import time headers={ #'User-Agent':'Nokia6600/1.0 (3. ...

  10. MovieReview—Black Panther(黑豹)

    Justice & Evil   The night before the night, i saw the latest movie in the Marvel series at JiaH ...