进程同步

进程的数据是独立存在的,进程也能加锁。

from multiprocessing import Process, Lock

def f(l,i):
l.acquire()
print('hello world',i)
l.release() if __name__ =='__main__':
lock = Lock() #获得锁的实例
for i in range(10):
Process(target=f,args=(lock,i)).start() #启动进程,并且把锁的实例传到进程

运行结果

hello world 0
hello world 2
hello world 1
hello world 3
hello world 6
hello world 7
hello world 8
hello world 4
hello world 5
hello world 9

进程为什么要加锁?

因为进程的数据是独立存在的,并不会共享同一块数据。但是有些资源是共享的,比如显示器。如果每个进程都要输出内容,那么显示的就很乱了,这个锁就是在某个进程独自输出的时候独占,不会被其它进程干扰。

进程池

apply  同步执行 串行

apply_async  异步执行 并行

from multiprocessing import Process, Pool,freeze_support
import time
import os def Foo(i):
time.sleep(2)
print('当前进程',os.getpid())
return i + 100 def Bar(arg):
print("-->exec done:",arg) if __name__ =='__main__':
freeze_support()
pool = Pool(processes=5) #允许进程池中同时放入5个进程 for i in range(10):
#pool.apply_async(func=Foo,args=(i,),callback=Bar)
pool.apply(func=Foo,args=(i,)) print('end')
pool.close()
pool.join() #进程池中进程执行完毕后在关闭,如果注释,那么程序直接关闭。.join()

运行结果

当前进程 5816  #sleep 2s  打印
当前进程 8124 #sleep 2s 打印
当前进程 6488 #sleep 2s 打印
当前进程 5356
当前进程 7036
当前进程 5816
当前进程 8124
当前进程 6488
当前进程 5356
当前进程 7036
end

以上是同步执行,程序显示的效果是串行化执行。

并行化

from multiprocessing import Process, Pool,freeze_support
import time
import os def Foo(i):
time.sleep(2)
print('当前进程',os.getpid())
return i + 100 def Bar(arg):
print("-->exec done:",arg) if __name__ =='__main__':
freeze_support()
pool = Pool(processes=5) #允许进程池中同时放入5个进程 for i in range(10):
pool.apply_async(func=Foo,args=(i,),callback=Bar)
#pool.apply(func=Foo,args=(i,)) print('end')
pool.close()
pool.join() #进程池中进程执行完毕后在关闭,如果注释,那么程序直接关闭。.join()

运行结果

end
当前进程 6060 #一次打印5个
当前进程 6952
-->exec done: 100
-->exec done: 101
当前进程 3388
-->exec done: 102
当前进程 1600
-->exec done: 103
当前进程 7648
-->exec done: 104
当前进程 6060
当前进程 6952
-->exec done: 105
-->exec done: 106
当前进程 3388
-->exec done: 107
当前进程 1600
-->exec done: 108
当前进程 7648
-->exec done: 109

callback() 回调函数,子进程执行完func,之后在调用的函数。 那么这个函数是子进程调用的还是主进程调用的?

from multiprocessing import Process, Pool,freeze_support
import time
import os def Foo(i):
time.sleep(2)
print('当前进程',os.getpid())
return i + 100 def Bar(arg):
print("-->exec done:",arg,os.getpid()) #显示调用当前函数的进程id if __name__ =='__main__':
freeze_support()
pool = Pool(processes=5) #允许进程池中同时放入5个进程
print("主进程",os.getpid()) #显示主进程id
for i in range(10):
pool.apply_async(func=Foo,args=(i,),callback=Bar)
#pool.apply(func=Foo,args=(i,)) print('end')
pool.close()
pool.join() #进程池中进程执行完毕后在关闭,如果注释,那么程序直接关闭。.join()

运行结果

主进程 7052
end
当前进程 7992
当前进程 1848
-->exec done: 101 7052
-->exec done: 100 7052
当前进程 2212
-->exec done: 102 7052
当前进程 980
当前进程 8064
-->exec done: 103 7052
-->exec done: 104 7052
当前进程 7992
-->exec done: 105 7052
当前进程 1848
-->exec done: 106 7052
当前进程 2212
-->exec done: 107 7052
当前进程 8064
当前进程 980
-->exec done: 109 7052
-->exec done: 108 7052

这里可以看到是主进程调用的回调,这些写的优点是,比如子进程做了数据备份要写到数据库,如果每个子进程都在执行的函数里面写,那么每个进程都要连接一次数据库,用主进程调用的方式就是可以省去这么多的连接数据库的操作。效率更高。

python 进程池的使用的更多相关文章

  1. python进程池:multiprocessing.pool

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

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

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

  3. python进程池剖析(三)

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

  4. python进程池剖析(二)

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

  5. python进程池剖析(一)

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

  6. 万里长征第一步:Python进程池的一点点小坑

    # -*- coding: utf- -*- """ Created on Thu Mar :: @author: lilide """ # ...

  7. python进程池

    当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiproce ...

  8. python 进程池的简单使用方法

    回到python,用一下python的进程池. 记得之前面试的时候,面试官问:你知道进程池的默认参数吗? 我没有回答上来,后来才知道,是有默认参数的.下面就看看它的默认参数 1. 不加参数 from ...

  9. python 进程池pool简单使用

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘ ...

  10. python 进程池Pool以及Queue的用法

    import os,time,random from multiprocessing import Pool def task(name): print('正在运行的任务:%s,PID:(%s)'%( ...

随机推荐

  1. Monkey基本使用(转载)

    什么是 Monkey Monkey 是一个 Android 自动化测试小工具.主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash. Monkey 特点 顾名思义,Mon ...

  2. 解决js array的key不为数字时获取长度的问题

    最近写js时碰到了当数组key不为数字时,获取数组的长度为0 的情况. 1.问题场景 var arr = new Array(); arr[‘s1‘] = 1001; console.log(arr. ...

  3. Dubbo的Api+Provider+Customer示例(IDEA+Maven+Springboot+dubbo)

    项目结构 dubbo-demo dubbo-api:提供api接口,一般存储实体类和接口服务 dubbo-provider:dubbo生产者提供服务,一般存储接口具体实现 dubbo-customer ...

  4. APP高级抓包

    1.fiddler的证书安装问题时密码问题 问题:我手机下载了fiddler证书 从设置里面安装证书 可是需要输入密码 我没有设置过密码 不知道密码是什么 请问有人遇到过这样的问题的?求解决方法 因为 ...

  5. 集合 相关 深浅copy

    '' 集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复. {} ''' # set1 = set({1,2,3}) # set2 = {1,2,3,[2,3],{'name':' ...

  6. 补充ABP Zero集成微信小程序登陆的BUG修复部分

    感谢园友 @turingguo 发布的 https://www.cnblogs.com/turingguo/p/9019026.html  文章,详细介绍了ABP Zero集成微信小程序登陆的实现过程 ...

  7. Git学习系列之经典的Git开发过程

     前言 Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上 ...

  8. 如何正确且高效地中文汉化Spyder 2 或 Spyder3(图文详解)(博主推荐)

    不多说,直接上干货!   汉化下载和教程页面 : https://github.com/kingmo888/Spyder_Simplified_Chinese 汉化文件最新版直接下载 : https: ...

  9. Linux下jdk安装过程

    注意:rpm 与软件相关命令 相当于 window 下的软件助手 管理软件 1 查看当前 Linux 系统是否已经安装 java 1)在命令窗口输入,可以查看系统自带的OpenJDK版本信息. jav ...

  10. SpringMVC Controller层的单元测试

    Getting Ready 测试相关Maven dependency如下: <dependency> <groupId>org.springframework</grou ...