python 进程池的使用
进程同步
进程的数据是独立存在的,进程也能加锁。
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 进程池的使用的更多相关文章
- python进程池:multiprocessing.pool
本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...
- python(进程池/线程池)
进程池 import multiprocessing import time def do_calculation(data): print(multiprocessing.current_proce ...
- python进程池剖析(三)
之前文章对python中进程池的原理.数据流以及应用从代码角度做了简单的剖析,现在让我们回头看看标准库中对进程池的实现都有哪些值得我们学习的地方.我们知道,进程池内部由多个线程互相协作,向客户端提供可 ...
- python进程池剖析(二)
之前文章中介绍了python中multiprocessing模块中自带的进程池Pool,并对进程池中的数据结构和各个线程之间的合作关系进行了简单分析,这节来看下客户端如何对向进程池分配任务,并获取结果 ...
- python进程池剖析(一)
python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...
- 万里长征第一步:Python进程池的一点点小坑
# -*- coding: utf- -*- """ Created on Thu Mar :: @author: lilide """ # ...
- python进程池
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiproce ...
- python 进程池的简单使用方法
回到python,用一下python的进程池. 记得之前面试的时候,面试官问:你知道进程池的默认参数吗? 我没有回答上来,后来才知道,是有默认参数的.下面就看看它的默认参数 1. 不加参数 from ...
- python 进程池pool简单使用
平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ‘ ...
- python 进程池Pool以及Queue的用法
import os,time,random from multiprocessing import Pool def task(name): print('正在运行的任务:%s,PID:(%s)'%( ...
随机推荐
- redis实现 msetex和 getdel命令
1.redis本身不提供 msetex命令(批量增加key并设置过期时间) class RedisExtend { private static final Logger logger = Logge ...
- Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法
一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...
- Shiro入门资源整理
学习一个框架,查阅权威有效的资料能够事半功倍,本文收集笔者学习此框架中帮助很大的文档,希望对大家有所帮助. 对于文档类的,强烈建议看官方文档,而不是百度出来的经过网友加工或者搬运过来的资料!! shi ...
- nodejs之socket.io 聊天实现
写在前面:最近很火的“996”话题,可谓是引起一片热议,马老师说:能够996应该是幸运的,996是对奋斗者的一种机遇(记得不是很清楚).996缺少的是自己的空闲时间了,当我是空闲的时候偶尔996挺好的 ...
- gcc 常用命令
gcc编译器 $ gcc -o XX.exe XXX.c ddd.c $ gcc -o XX.asm -S XXX.c 编译生成可执行文件,并执行程序,缺省的时候,gcc 编译出来的文件是a.out ...
- Oracle 如何修改列的数据类型
链接:http://www.cnblogs.com/david-zhang-index/archive/2012/04/10/2441015.html 对字段操作 操作方法 更新字段名 alter t ...
- python+unittest+requests实现接口自动化
前言: Requests简介 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 ...
- 【CSS】 一个简单的导航条
今天来做一个导航条! 首先写一个坯子: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &quo ...
- WPF的DatePicker--日期选择器
1. 日期选择器 DatePicker, 如图: 点击打开后显示如下: 2. 关键属性 SelectedDate SelectedDate属性, DateTime? 类型(可为空的DateTime类型 ...
- Spring - 几种RPC模型的使用与比较
Spring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework ...