一.manager

常用的数据类型:dict list 能够实现进程之间的数据共享

进程之间如果同时修改一个数据,会导致数据冲突,因为并发的特征,导致数据更新不同步。

def work(dic, lock):

# 简写:使用with语法自动给你上锁和解锁

with lock:

dic["count"] -= 1

'''

#上锁的正常写法

#上锁

lock.acquire()

#数据值减一

dic["conut"] -=1

# 解锁

lock.release()

'''

if __name__ == "__main__":

# 创建Manager对象

m = Manager()

# 创建一个锁对象(为了保证数据的同步)

lock = Lock()

lst = []

# 创建共享字典

dic = m.dict({"count": 100})

# 产生一百个进程。每个进程减一。

for i in range(100):

# 返回进程对象p

p = Process(target=work, args=(dic, lock))

p.start()

lst.append(p)

for i in lst:

i.join()

print(dic)

二.进程池pool

小知识点:

import os

# 计算你的机器有多少cpu

print(os.cpu_count())

1.比较pool 和Process 执行的速度

因为进程池可以实现并行的概念,比process单核并发的速度快

def func(num):

# time.sleep(3)

# time.sleep(random.uniform(0.1,1))

print("这是发送的第%d邮件" % (num))

if __name__ == "__main__":

startime = time.time()

# (1)进程池实现并行

# 创建进程对象

# pool() 里面的参数是同一个时间允许多少个进程并行

'''

4个任务

(1)1个人做4个

(2)4个人做4个

(3)4个人做1个

任务量较少时,3的速度较快,任务量较大时,2的速度更快.

因为如果任务线拉长,频繁切换cpu会占点时间.

'''

p = Pool()  #默认是电脑cpu的核数,默认的时候任务量大更好

# 1 的时候 0.2560138702392578,如果是1表示电脑核数同时执行1个进程

# 不停的更换cpu运行进程任务,这样避免cpu过热降频

for i in range(100):

p.apply_async(func, args=(i,))

# 关闭进程池,不在接收新的进程

p.close()

# 主进程阻塞,等待子进程全部完成后再退出

p.join()

endtime = time.time()

print(endtime - startime)  # 0.43866443634033203

# (2) Process 单核并发程序

startime = time.time()

lst = []

for i in range(100):

p = Process(target=func,args=(i,))

p.start()

lst.append(p)

for i in lst:

i.join()

endtime = time.time()

print(endtime-startime) # 8.061640739440918

2.apply 开启进程(未来可能去掉)

同步阻塞,每次都要等待当前任务完成之后,在开启下一个进程,可加上返回值。

def task(num):

time.sleep(random.uniform(0.1,1)) # 同步程序

print("%s:%s" % (num,os.getpid()))

return num

if __name__ == "__main__":

p = Pool()

for i in range(20):

res = p.apply(task,args=(i,))

print("-->",res)

# 完完全全的同步程序,等上面走完了再执行finish

print("finish")

同一时间只有4个进程。

3.apply_async 异步非阻塞程序 可以有返回值

Process 产生的子进程,默认主进程等待所有子进程执行完毕之后再终止

而Pool进程池,只要主进程跑完了,立刻终止所有程序

未来避免还没有执行就结束,进程time.sleep  和使用join守护。

例:

def task(num):

#time.sleep(3)

time.sleep(random.uniform(0.1,1)) #同步程序

print("%s:%s" %(num,os.getpid()))

return os.getpid()

if __name__ == "__main__":

p = Pool()

lst = []

lst2 = []

for i in range(20):

res = p.apply_async(task,args=(i,))  # res 是对象

# print(res)

# 1.把返回的对象一个一个插入到列表里

lst.append(res)

for i in lst:

# 2.使用get方法获取返回值

lst2.append(i.get())

# 关闭进程池.不在接受新的进程

p.close()

# 主进程阻塞,等待 子进程全部完成后再退出

p.join()

# 主进程阻塞,等待进程全部完成后再退出

# 返回的是默认 4个进程,因为当期机器是4个核心cpu

print(set(lst2),len(set(lst2)))

print("finish")

4.进程池.map

(与高阶函数map使用方法一样,只不过该map支持并行并发)

# 进程池.map 返回的是列表

# map默认底层中加了阻塞,等全部执行完毕之后,主进程在终止程序,区别于3

例:

if __name__ == "__main__":

p = Pool()

lst = p.map(task, range(100))

print(lst)

# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801]

# 如果出现了join,一定需要加上close,要么同时出现,要么都没有

# p.close()

# p.join()

print(123455)

5.关闭进程池

关闭进程池,不会再接受新的进程

例:

def task(num):

time.sleep(random.uniform(0.1,1))

print("%s:%s" % (num,os.getpid()))

return num ** 2

if __name__ == "__main__":

p = Pool()

lst= []

for i in range(20):

res = p.apply_async(task,args=(i,))

lst.append(res)

# get 函数内部默认加了阻塞,获取完所有值之后再向下执行

for i in lst:

print(i.get())

p.close()

# 如果执行close,不能够继续往进程池里面加进程了

# res = p.apply_async(task,args=(112233,))

p.join()

print("finish")

去掉程序例:  # res = p.apply_async(task,args=(112233,))的注释就出现想要的结果:

Python 之并发编程之manager与进程池pool的更多相关文章

  1. Python进阶:并发编程之Futures

    区分并发和并行 并发(Concurrency). 由于Python 的解释器并不是线程安全的,为了解决由此带来的 race condition 等问题,Python 便引入了全局解释器锁,也就是同一时 ...

  2. python进程之间修改数据[Manager]与进程池[Pool]

    #前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据 #Mnager就可以实现 import multiprocess ...

  3. python基础-并发编程之I/O模型基础

    1. I/O模型介绍 1.1 I/O模型基础 更好的理解I/O模型,需要先回顾:同步.异步.阻塞.非阻塞 同步:执行完代码后,原地等待,直至出现结果 异步:执行完代码后,不等待,继续执行其他事务(常与 ...

  4. Python进阶:并发编程之Asyncio

    什么是Asyncio 多线程有诸多优点且应用广泛,但也存在一定的局限性: 比如,多线程运行过程容易被打断,因此有可能出现 race condition 的情况:再如,线程切换本身存在一定的损耗,线程数 ...

  5. python并发编程之Queue线程、进程、协程通信(五)

    单线程.多线程之间.进程之间.协程之间很多时候需要协同完成工作,这个时候它们需要进行通讯.或者说为了解耦,普遍采用Queue,生产消费模式. 系列文章 python并发编程之threading线程(一 ...

  6. python并发编程之multiprocessing进程(二)

    python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...

  7. python并发编程之gevent协程(四)

    协程的含义就不再提,在py2和py3的早期版本中,python协程的主流实现方法是使用gevent模块.由于协程对于操作系统是无感知的,所以其切换需要程序员自己去完成. 系列文章 python并发编程 ...

  8. python并发编程之asyncio协程(三)

    协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...

  9. python并发编程之threading线程(一)

    进程是系统进行资源分配最小单元,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.进程在执行过程中拥有独立的内存单元,而多个线程共享内存等资源. 系列文章 py ...

随机推荐

  1. 高斯消元-bzoj1013-球形空间产生器

    This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...

  2. @AliasFor 原理

      用法: import org.springframework.core.annotation.AliasFor; import java.lang.annotation.*; @Target(El ...

  3. 【原】docker基础(一)

    1.架构 2.说明 Docker daemon( Docker守护进程):Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程.可通过 Docker客户端与之通信. Cl ...

  4. 每天进步一点点------Verilog 测试平台(Testbench) (一)

    每天进步一点点------Verilog 测试平台(Testbench) (一)

  5. 汪莹:以RELX悦刻为例,复盘中国品牌出海的跨文化挑战

    海外销售额每月2倍增速,3个月拿下东南亚市场第一,出口43个国家,拥有250万用户--你可能不知道,这是一家成立仅一年半.出海仅7个月的中国企业交出的答卷. 这家企业就是中国第一大电子烟品牌RELX悦 ...

  6. CentOS6.5_x64安装MySQL-5.6.17,在已经启动MySQL服务的情况下,出现密码报错ERROR 2002 (HY000)

    1.修改MySQL配置文件,使MySQL登陆时跳过密码验证 skip-grant-tables 2.重启MySQL服务 service mysql restart 3.进入MySQL,修改user表中 ...

  7. HDU2444 The Accomodation of Students(二分图最大匹配)

    有n个关系,他们之间某些人相互认识.这样的人有m对.你需要把人分成2组,使得每组人内部之间是相互不认识的.如果可以,就可以安排他们住宿了.安排住宿时,住在一个房间的两个人应该相互认识.最多的能有多少个 ...

  8. 10,html全局属性有哪些

    10,html全局属性(global attribute,html属性赋予元素意义和语境,html全局属性可以用于任何的html元素)有哪些 class:为元素设置类标识 data-*:为元素增加自定 ...

  9. 【Python下进程同步之互斥锁、信号量、事件机制】

    " 一.锁机制:  multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的 ...

  10. Tensorflow2.0默认下载数据集到C盘的修改方法

    jupyter(Win版本)下载数据集会默认到C盘下,Linux会默认到root下,修改方式如下· tf1.x: import os import tensorflow as tftf.disable ...