进程同步

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

  1. from multiprocessing import Process, Lock
  2.  
  3. def f(l,i):
  4. l.acquire()
  5. print('hello world',i)
  6. l.release()
  7.  
  8. if __name__ =='__main__':
  9. lock = Lock() #获得锁的实例
  10. for i in range(10):
  11. Process(target=f,args=(lock,i)).start() #启动进程,并且把锁的实例传到进程

运行结果

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

进程为什么要加锁?

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

进程池

apply  同步执行 串行

apply_async  异步执行 并行

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

运行结果

  1. 当前进程 5816 #sleep 2s 打印
  2. 当前进程 8124 #sleep 2s 打印
  3. 当前进程 6488 #sleep 2s 打印
  4. 当前进程 5356
  5. 当前进程 7036
  6. 当前进程 5816
  7. 当前进程 8124
  8. 当前进程 6488
  9. 当前进程 5356
  10. 当前进程 7036
  11. end

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

并行化

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

运行结果

  1. end
  2. 当前进程 6060 #一次打印5个
  3. 当前进程 6952
  4. -->exec done: 100
  5. -->exec done: 101
  6. 当前进程 3388
  7. -->exec done: 102
  8. 当前进程 1600
  9. -->exec done: 103
  10. 当前进程 7648
  11. -->exec done: 104
  12. 当前进程 6060
  13. 当前进程 6952
  14. -->exec done: 105
  15. -->exec done: 106
  16. 当前进程 3388
  17. -->exec done: 107
  18. 当前进程 1600
  19. -->exec done: 108
  20. 当前进程 7648
  21. -->exec done: 109

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

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

运行结果

  1. 主进程 7052
  2. end
  3. 当前进程 7992
  4. 当前进程 1848
  5. -->exec done: 101 7052
  6. -->exec done: 100 7052
  7. 当前进程 2212
  8. -->exec done: 102 7052
  9. 当前进程 980
  10. 当前进程 8064
  11. -->exec done: 103 7052
  12. -->exec done: 104 7052
  13. 当前进程 7992
  14. -->exec done: 105 7052
  15. 当前进程 1848
  16. -->exec done: 106 7052
  17. 当前进程 2212
  18. -->exec done: 107 7052
  19. 当前进程 8064
  20. 当前进程 980
  21. -->exec done: 109 7052
  22. -->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. linux中校验文件完整性(md5,sha1)

    经常在Linux下下载软件的人,一定会有一个良好的习惯:校验文件的hash,以确定文件的完整性甚至是安全性.我配置环境的时候也恰好用到了,笔者的是一个lubuntu的机子.这里我大致做个记录.(不了解 ...

  2. linux忘记root密码怎么办

    如何找回root密码,如果我们不小心,忘记root密码,怎么找回? 思路:进入到单用户模式,然后修改root密码.因为进入单用户模式,root不需要密码就可以登录. 详细过程: 1.打开虚拟机 2.开 ...

  3. UUID生成工具

    public class UUIDUtils { private static SecureRandom SEEDER_STATIC = null; private static byte[] ADD ...

  4. Python爬虫:微博粉丝列表

    前言 本来打算做一个关于微博粉丝列表的爬虫,可以统计一下某个微博账号的粉丝里面,僵尸粉(水军)的数量,大V数量. 结果写完爬虫才发现,现在微博只给人看粉丝列表的前5页.......哈哈,好吧.挺无奈的 ...

  5. 自学springboot

    参考资料 https://www.renren.io/guide/

  6. Delphi对Word的基本操作

    一.Delphi程序启动Word 采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为: 首先使用GetActiveOleObject('Word.Applicat ...

  7. java POST 传值 加签 验证

    话不多说,代码如下 package com.syl.test_key; import lombok.extern.slf4j.Slf4j; import org.apache.commons.code ...

  8. ASP.NET 页生命周期概述1

    ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件处理程序代码以及进行 呈现.了解页生命周期非常重要,因为这样 ...

  9. jquery 使用整理

    1. 如何创建嵌套的过滤器 //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器匹配的部分.在这种情况下, //查询删除了任何没(:not)有(:has) //包含class为“se ...

  10. 使用Having子句

    Having 子句与where子句的功能类似,都是对行进行筛选.但是,where搜索条件是在分组操作之前对记录进行筛选,然后再由group BY 对筛选后符合条件的行进行分组:而Having搜索条件则 ...