南宁网站推广v1,高端网站开发注意事项,建设银行江门市新会网站,安卓手机网页视频怎么下载复习#xff1a; # 锁
# 多个进程在同一时间只有一个进程能进入代码去执行# 信号量 Semaphore
from multiprocessing import Semaphore
# 用锁的原理实现的。内置了一个计数器
#在同一时间 只能有指定数量的进程执行某一段被控制住的代码#事件
# wait阻塞收到事件状态控制的同…复习 # 锁
# 多个进程在同一时间只有一个进程能进入代码去执行# 信号量 Semaphore
from multiprocessing import Semaphore
# 用锁的原理实现的。内置了一个计数器
#在同一时间 只能有指定数量的进程执行某一段被控制住的代码#事件
# wait阻塞收到事件状态控制的同步组件
# 状态 True False 利用is_set查看#true--false clear()#false--true set()
#wait 状态为True不阻塞状态为False的时候阻塞# 锁 多个进程在同一时间只有一个进程能进入代码去执行
# 信号量 在同一时间 只能有指定数量的进程执行某一段被控制住的代码
# 事件 进程要执行必须等通知
# 进程池 内有固定数目的进程。轮流利用进程#队列
# Queue
# put() 当队列满的时候阻塞等待队列有空位置
# get() 当队列空的时候阻塞等待队列有数据
# full() empty() 不太准确
# JoinableQueue# get() task_done# put() join 等待数据取完并处理完 管道
案例1
def func(conn):conn.send(hello)
if __name__ __main__:conn1, conn2 Pipe()Process(targetfunc,args(conn1,)).start()print(conn2.recv())#运行结果
# hello
案例2
def func(conn1,conn2):conn2.close() # 将不用的链接关闭while True:try:msgconn1.recv()# if msg is None:breakprint(msg)except EOFError:conn1.close()break
if __name__ __main__:conn1, conn2 Pipe()Process(targetfunc,args(conn1,conn2)).start() #参数必须将conn1,conn2都传过去conn1.close()for i in range(5):conn2.send(hello)# conn2.send(None)conn2.close()
运行结果 管道实现生产者消费者模型
from multiprocessing import Process,Pipe,Lock
import time
import random
def producer(con,pro,name,food):con.close()for i in range(5):time.sleep(random.random())f%s生产%s第%i个%(name,food,i)print(f)pro.send(f)pro.close()
def consumer(con,pro,name):pro.close()while True:try:foodcon.recv()print(%s吃了%s%(name,food))time.sleep(random.random())except EOFError:con.close()breakif __name__ __main__:con,proPipe()pProcess(targetproducer,args(con,pro,egon,饺子))p.start()cProcess(targetconsumer,args(con,pro,alex))c.start()c1 Process(targetconsumer, args(con, pro, Tony))c1.start()con.close()pro.close()# Pipe 数据不安全性 多个消费者同时取一个数据
# 管道是进程数据不安全的 利用加锁
# IPC
运行结果
管道实现生产者消费者模型-改进
from multiprocessing import Process,Pipe,Lock
import time
import random
def producer(con,pro,n):con.close()for i in range(n):pro.send(i)pro.send(None)pro.send(None)pro.close()def consumer(lock,con,pro,name):pro.close()while True:lock.acquire()foodcon.recv()lock.release()if food:print(%s吃了%s%(name,food))time.sleep(random.random())else:con.close()breakif __name__ __main__:con,proPipe()lockLock()pProcess(targetproducer,args(con,pro,10))p.start()cProcess(targetconsumer,args(lock,con,pro,alex))c.start()c1 Process(targetconsumer, args(lock,con, pro, Tony))c1.start()con.close()pro.close()# Pipe 数据不安全性 多个消费者同时取一个数据
# 管道是进程数据不安全的 利用加锁
# IPC
# 队列 进程之间数据安全
# 队列管道锁
运行结果
进程间数据共享
from multiprocessing import Manager,Process,Lock
def main(dict,lock):lock.acquire()dict[count]-1lock.release()
if __name__ __main__:mManager() # object 对象lLock()dictm.dict({count:100})p_list[]for i in range(50):pProcess(targetmain,args(dict,l))p.start()p_list.append(p)for i in p_list:i.join()print(主进程,dict)
运行结果
进程池-map # 为什么会有进程池的概念#效率# 每开启进程开启属于这个进程的内存空间# 寄存器 堆栈 文件# 进程过多 操作系统的调度
# 进程池# python中的 先创建一个属于进程的池子# 这个池子指定能存放多少个进程# 先将这些进程创建好
# 更高级的进程池 python没有# n,m# n 只起n个进程# 加进程# 一直加到上限m个# 进程空闲时再减少进程一直减到n个。。。
from multiprocessing import Pool,Process
def func(n):for i in range(2):print(n1)
def func2(n):# n[0]# n[1]for i in range(2):print(n[0])
# Process 超过5个进程就用进程池。一般个数是cpu1
import time
if __name__ __main__:starttime.time()poolPool(5) # 5个进程pool.map(func,range(6)) #100个任务自带join#pool.map(func2,range(100)) # 100个任务自带joinpool.map(func2, [(alex,1),egon]) # 100个任务自带joint1time.time()-startstarttime.time()# 等价于多进程p_list[]for i in range(6):pProcess(targetfunc,args(i,))p_list.append(p)p.start()for p in p_list:p.join()t2 time.time() - startprint(t1,t2)运行结果
进程池-apply
from multiprocessing import Pool,Process
import time,os
def func(n):print(start func%s%n,os.getpid())time.sleep(1)print(end func%s%n,os.getpid())if __name__ __main__:pPool(5)# for i in range(10):# p.apply(func,args(i,)) # 同步for i in range(10):p.apply_async(func, args(i,)) # 异步。主进程结束就结束了。没有等子进程结束p.close() # 结束进程池接收任务p.join() # 感知进程池中的任务执行结束。然而进程池中的进程永远是活着的运行结果
进程池的返回值
# pPool()
# p.map(funcname,iterable) 默认异步的执行任务且自带close和join
# p.apply() 同步调用
# p.apply_async 异步调用和主进程完全异步 需要手动close和joinapply
# from multiprocessing import Pool
# def func(i):
# return i*i
#
# if __name__ __main__:
# pPool(5) # 如果不写5默认为cpu个数
# for i in range(10):
# resp.apply(func,args(i,))
# print(res)apply_async异步
# from multiprocessing import Pool
# import time
# def func(i):
# time.sleep(0.5)
# return i*i
#
# if __name__ __main__:
# pPool(5) # 如果不写5默认为cpu个数
# for i in range(10):
# resp.apply_async(func,args(i,))
# print(res.get()) # 阻塞等待结果apply_async异步
# from multiprocessing import Pool
# import time
# def func(i):
# time.sleep(0.5)
# return i*i
#
# if __name__ __main__:
# pPool(5) # 如果不写5默认为cpu个数
# res_list[]
# for i in range(10):
# resp.apply_async(func,args(i,))
# res_list.append(res)
# # print(res.get()) # 阻塞等待结果
# print(123)
# for res in res_list:print(res.get())#map异步
from multiprocessing import Pool
import time
def func(i):time.sleep(0.5)return i*iif __name__ __main__:pPool(5) # 如果不写5默认为cpu个数retp.map(func,range(10))print(ret)运行结果
进程池的回调函数
# 回调函数
import os
from multiprocessing import Pool
def func1(n):print(func1:,os.getpid())print(in func1)return n*ndef func2(nn):print(func2:,os.getpid())print(in func2)print(nn)if __name__ __main__:print(主进程:, os.getpid())pPool(5)p.apply_async(func1,args(8,),callbackfunc2)p.close()p.join()
运行结果
回调函数2
# 回调函数 爬虫用到
# 爬虫 访问一个网址将数据从网址上下载下来。数据是bytes转成字符串。处理字符串
from multiprocessing import Pool
def func1(n):return n1
def func2(m):print(m)
if __name__ __main__:pPool(5)for i in range(10,20):p.apply_async(func1,args(i,),callbackfunc2)p.close()p.join() 运行结果 回调函数爬虫例子
import requests
from urllib.request import urlopen
from multiprocessing import Pool
# responserequests.get(http://www.baidu.com)
# print(response)
# print(response.__dict__)
# print(response.status_code)
# print(response.content.decode(utf-8))def get(url):responserequests.get(url)if response.status_code200:return url,response.content.decode(utf-8)def get_urllib(url):returlopen(url)return ret.read().decode(utf-8)def call_back(args):url,contentargsprint(url,len(content))if __name__ __main__:url_list[http://www.cnblogs.com,http://www.baidu.com,http://www.sogou.com,http://www.suhu.com,]pPool(5)for url in url_list:p.apply_async(get,args(url,),callbackcall_back)p.close()p.join()
运行结果
使用进程池qq聊天
server端
import socket
from multiprocessing import Pool
def func(conn):conn.send(bhello)print(conn.recv(1024).decode(utf-8))conn.close()if __name__ __main__:pPool(5)sksocket.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 socketsksocket.socket()
sk.connect((127.0.0.1,8080))retsk.recv(1024).decode(utf-8)
print(ret)
msginput().encode(utf-8)
sk.send(msg)
sk.close()
运行结果