一、多进程multiprocessing

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。

  1. 1 import multiprocessing,threading
  2. 2 import time
  3. 3
  4. 4 def thread_run():
  5. 5 print(threading.get_ident())
  6. 6 def run(name):
  7. 7 time.sleep(2)
  8. 8 print('Hello ',name)
  9. 9 t = threading.Thread(target=thread_run)
  10. 10 t.start()
  11. 11
  12. 12
  13. 13 if __name__== '__main__':
  14. 14 for i in range(10):
  15. 15 p = multiprocessing.Process(target=run, args=('bob_%s'%i,))
  16. 16 p.start()

运行结果:

  1. 1 Hello bob_0
  2. 2 1144
  3. 3 Hello bob_8
  4. 4 1268
  5. 5 Hello bob_4
  6. 6 4360
  7. 7 Hello bob_2
  8. 8 768
  9. 9 Hello bob_6
  10. 10 5308
  11. 11 Hello bob_5
  12. 12 Hello bob_1
  13. 13 6076
  14. 14 5088
  15. 15 Hello bob_9
  16. 16 6104
  17. 17 Hello bob_3
  18. 18 5196
  19. 19 Hello bob_7
  20. 20 748

二、进程池

如果要创建多个进程,可以使用进程池,启用进程池需要使用Pool库,使用指令pool=Pool()可自动调用所有CPU,

map()函数相当于一个循环,将参数2中的列表元素逐次灌入参数1的函数中。

  1. 1 from multiprocessing import Pool
  2. 2
  3. 3 def squre(num):
  4. 4 return num ** 2
  5. 5
  6. 6
  7. 7 if __name__ == '__main__':
  8. 8 numbers = [0,1,2,3,4,5]
  9. 9 pool = Pool(processes=5)#进程池中最多能放入5个进程
  10. 10 print(pool.map(squre,numbers))

运行结果:

  1. [0, 1, 4, 9, 16, 25]

Pool还有以下常用的方法:

  • apply_async(func, args)从进程池中取出一个进程执行func,args为func的参数。它将返回一个AsyncResult的对象,我们可以调用get()方法以获得结果。
  • close() 关闭进程池,不再创建新的进程
  • join() wait()进程池中的全部进程。但是必须对Pool先调用close()方法才能join.
  1. 1 from multiprocessing import Process, Pool,freeze_support
  2. 2 import time
  3. 3 import os
  4. 4
  5. 5 def Foo(i):
  6. 6 time.sleep(2)
  7. 7 print("in process",os.getpid())
  8. 8 return i + 100
  9. 9
  10. 10 def Bar(arg):
  11. 11 print('-->exec done:', arg,os.getpid())
  12. 12
  13. 13 if __name__ == '__main__':
  14. 14 #freeze_support()
  15. 15 pool = Pool(processes=3)
  16. 16 print("主进程",os.getpid())
  17. 17 for i in range(10):
  18. 18 pool.apply_async(func=Foo, args=(i,), callback=Bar) #callback=回调
  19. 19
  20. 20 print('end')
  21. 21 pool.close()
  22. 22 pool.join()

运行结果:

  1. 1 主进程 5660
  2. 2 end
  3. 3 in process 7048
  4. 4 -->exec done: 100 5660
  5. 5 in process 3396
  6. 6 -->exec done: 101 5660
  7. 7 in process 6728
  8. 8 -->exec done: 102 5660
  9. 9 in process 7048
  10. 10 -->exec done: 103 5660
  11. 11 in process 3396
  12. 12 -->exec done: 104 5660
  13. 13 in process 6728
  14. 14 -->exec done: 105 5660
  15. 15 in process 7048
  16. 16 -->exec done: 106 5660
  17. 17 in process 3396
  18. 18 -->exec done: 107 5660
  19. 19 in process 6728
  20. 20 -->exec done: 108 5660
  21. 21 in process 7048
  22. 22 -->exec done: 109 5660

除了主进程,其它结果是三个一组执行的,因为进程池中每次最多有三个进程。

三、进程通信

进程间通信常用两种方法:Queue和pipe,Queue可以用在多个进程间实现通信,pipe用在两个进程间通信。

  1. 1 import os
  2. 2 import multiprocessing
  3. 3 import time
  4. 4 #==================
  5. 5 # input worker
  6. 6 def inputQ(queue):
  7. 7 info = str(os.getpid()) + '(put):' + str(time.time())
  8. 8 queue.put(info)
  9. 9
  10. 10 # output worker
  11. 11 def outputQ(queue,lock):
  12. 12 info = queue.get()
  13. 13 lock.acquire()
  14. 14 print (str(os.getpid()) + '(get):' + info)
  15. 15 lock.release()
  16. 16
  17. 17 if __name__ == '__main__':
  18. 18 record1 = [] # store input processes
  19. 19 record2 = [] # store output processes
  20. 20 lock = multiprocessing.Lock() # To prevent messy print
  21. 21 queue = multiprocessing.Queue(3)
  22. 22
  23. 23
  24. 24 for i in range(10):
  25. 25 process = multiprocessing.Process(target=inputQ, args=(queue,))
  26. 26 process.start()
  27. 27 record1.append(process)
  28. 28
  29. 29
  30. 30 for i in range(10):
  31. 31 process = multiprocessing.Process(target=outputQ, args=(queue, lock))
  32. 32 process.start()
  33. 33 record2.append(process)
  34. 34
  35. 35 for p in record1:
  36. 36 p.join()
  37. 37
  38. 38 queue.close()
  39. 39
  40. 40 for p in record2:
  41. 41 p.join()

运行结果:

  1. 1 4004(get):4556(put):1476337412.4875286
  2. 2 512(get):5088(put):1476337412.6345284
  3. 3 8828(get):7828(put):1476337412.7965286
  4. 4 8372(get):1032(put):1476337412.8185284
  5. 5 7740(get):1496(put):1476337412.9205284
  6. 6 4176(get):632(put):1476337412.9855285
  7. 7 5828(get):8508(put):1476337412.9595284
  8. 8 4236(get):9204(put):1476337412.9925284
  9. 9 7632(get):8956(put):1476337413.2055285
  10. 10 6376(get):4160(put):1476337413.0705285

Pipe可以是单向(half-duplex),也可以是双向(duplex)。我们通过mutiprocessing.Pipe(duplex=False)创建单向管道 (默认为双向)。一个进程从PIPE一端输入对象,然后被PIPE另一端的进程接收,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入。

  1. 1 from multiprocessing import Process, Pipe
  2. 2
  3. 3
  4. 4 def f(conn):
  5. 5 conn.send([42, None, 'hello from child'])
  6. 6 conn.send([42, None, 'hello from child2'])
  7. 7 print("from parent:",conn.recv())
  8. 8 conn.close()
  9. 9
  10. 10 if __name__ == '__main__':
  11. 11 parent_conn, child_conn = Pipe()
  12. 12 p = Process(target=f, args=(child_conn,))
  13. 13 p.start()
  14. 14 print(parent_conn.recv()) # prints "[42, None, 'hello']"
  15. 15 print(parent_conn.recv()) # prints "[42, None, 'hello']"
  16. 16 parent_conn.send("chupi可好") # prints "[42, None, 'hello']"
  17. 17 p.join()

运行结果:

  1. 1 [42, None, 'hello from child']
  2. 2 [42, None, 'hello from child2']
  3. 3 from parent: chupi可好

python10的更多相关文章

  1. Python10行以内代码能有什么高端操作

    Python10行以内代码能有什么高端操作 Python凭借其简洁的代码,赢得了许多开发者的喜爱.因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代 ...

  2. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  3. Python-10 字典

    #1 创建 dict1={'欢欢':'i love','小高高':'you'} dict2={1:'one',2:'two',3:'three'} dict3={} #2 访问元素 print('欢欢 ...

  4. Python-10 字典dict

    #1 创建 dict1={'欢欢':'i love','小高高':'you'} dict2={1:'one',2:'two',3:'three'} dict3={} #2 访问元素 print('欢欢 ...

  5. Python-10行代码实现3个数据可视化

    阅读本文约“1分钟” 最近将Python作为第二编程语言,进行了了解与学习,可以说它的包是很强大的.这次的demo仅仅不到10行代码就可以实现三个数据可视化的小实例. 我们将要使用到matplotli ...

  6. 饮冰三年-人工智能-Python-10之C#与Python的对比

    1:注释 C# 中 单行注释:// 多行注释:/**/ python 中 单行注释:# 多行注释:“““内容””” 2:字符串 C#中 "" 用双引号如("我是字符串&q ...

  7. Python10/24--组合/封装/property装饰器/多态

    组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=111 ...

  8. Python10/23--继承/派生

    (继承)1. 什么是继承? 在程序中继承是一种新建子类的方式,新创建的类称之为子类\派生类,被继承的类称之为父类\基类\超类 继承描述的是一种遗传关系,子类可以重用父类的属性 2. 为何用继承? 减少 ...

  9. Python10/22--面向对象编程/类与对象/init函数

    类: 语法: class关键字 类名# 类名规范 大写开头 驼峰命名法class SHOldboyStudent: # 描述该类对象的特征 school = "上海Oldboy" ...

  10. Python10/17-re模块/hashlib模块/logging模块

    import logging # 1.日志的级别# logging.debug("这是一个调试信息") # 10# logging.info("常规信息") # ...

随机推荐

  1. 数据库开发 Oracle与mysql间的批量处理接口 SSIS+存储过程实现

    公司目前不同的业务系统用了不同的数据库,涉及到oracle.mysql.sqlserver.而一些核心的业务在mysql中,所以平时经常要把oracle.sqlserver中的数据插入到mysql中. ...

  2. 华为面试题(JAVA版)

    [编程题] 扑克牌大小时间限制:10秒空间限制:131072K扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写 ...

  3. sql优化,如何将in换为exists

    原sql语句 -- 根据权限表查出该用户拥有的所有权限菜单 select * from tb_power where id in( select power_id from tb_role_power ...

  4. MySQL基础篇(07):用户和权限管理,日志体系简介

    本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL用户 1.基础描述 在数据库的使用过程中,用户作为访问数据库的鉴权因素,起到非常重要的作用,安装MySQL时会自动生成一个roo ...

  5. [dfs] HDU 2019 Multi-University Training Contest 10 - Block Breaker

    Block Breaker Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)T ...

  6. [Redis] 万字长文带你总结Redis,助你面试升级打怪

    文章目录 Redis的介绍.优缺点.使用场景 Linux中的安装 常用命令 Redis各个数据类型及其使用场景 Redis字符串(String) Redis哈希(Hash) Redis列表(List) ...

  7. 牛客网剑指offer【Python实现】——part1

    斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,n<=39). 循环实现,时间复杂度n def Fibonacci(self, ...

  8. ubuntu 18.04下virtualbox安装windows虚拟机+增强功能+secureCRT

    先强调一下,我是在Ubuntu里安装windows虚拟机,如果要看如何安装linux虚拟机的话,那么你走错地方了. 我一直使用Linux系统做开发的,选择Ubuntu是因为多数常用软件对Ubuntu支 ...

  9. iOS 内置图片瘦身

    一.iOS 内置资源的集中方式 1.1 将图片存放在 bundle 这是一种很常见的方式,项目中各类文件分类放在各个 bundle 下,项目既整洁又能达到隔离资源的目的.采用 bundle 的加载方式 ...

  10. RuntimeError: PyTorch was compiled without NumPy support

    原因:Pytorch和Numpy版本不匹配 查看自己Pytorch和Numpy版本 (1)执行[pip show torch]和[pip show numpy]查看版本信息(可通过[pip -h]查看 ...