一、多进程multiprocessing

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

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

运行结果:

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

二、进程池

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

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

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

运行结果:

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

Pool还有以下常用的方法:

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

运行结果:

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

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

三、进程通信

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

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

运行结果:

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

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

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

运行结果:

1 [42, None, 'hello from child']
2 [42, None, 'hello from child2']
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. ASP.NET页面使用AjaxPro2完成JS调用后台方法

    一.首先下载AjaxPro.2.dll(附下载地址) 百度网盘链接:https://pan.baidu.com/s/1r87DE1Tza9F4NbJwTCS1AQ 提取码:10p6 二.在Visual ...

  2. rem - 移动前端自适应适配布局解决方案和比较(转载)

    原文链接:http://caibaojian.com/mobile-responsive-example.html 互联网上的自适应方案到底有几种呢?就我个人实践所知,有这么几种方案:· 固定一个某些 ...

  3. java 知识点总结(转)

    转载自 https://www.cnblogs.com/wl310538259/p/5218251.html (一)Java 1.接口和抽象类的区别 ①抽象类里可以有构造方法,而接口内不能有构造方法. ...

  4. 如何简单的将手机投屏在windows上(可在电脑上直接操作手机)

    首先附上要使用的scrcpy源地址 接下来是如何使用(我用的是安卓手机+win10): 下载好后,首先使用数据线连接手机到电脑,并且手机需要打开开发人员选项(不知道如何打开的自行百度): 打开到安装s ...

  5. JDBC(三)----JDBC控制事务

    ##  JDBC控制事务 1.事务:一个包含多个步骤的业务操作.如果这个业务员操作被事务管理,则这多个步骤要么同时成功,要么同时失败. 2.操作: 1.开启事务 2.提交事务 3.回滚事务 3.使用C ...

  6. 【i春秋 综合渗透训练】渗透测试笔记

    网站是齐博CMS V7.0    1.要求获得管理员密码:   利用齐博CMS V7.0  SQL爆破注入漏洞即可得到管理员用户名密码    https://www.cnblogs.com/vspid ...

  7. uni-app实现文件上传(h5方式)

    1.嵌入H5页面,需要采用web-view标签,如下: <web-view src="/hybrid/html/index.html" @message="hand ...

  8. bzoj4693

    题意 bzoj 做法 结论1:对于\((X_1,X_2,...,X_k)\),其为红的充要条件为:令\(Y_i=X_i-1\),\(\prod\limits_{k=1}^K {\sum\limits_ ...

  9. sql-lib闯关31-40

    第三十一关 此关用WAF防护 和第三十关基本一样,在双引号后面添加括号进行闭合 语句可以有两种,?id=-1")union select 1,2,database() --+    或者   ...

  10. 手把手教你学Git

    Git 使用手册独家实战 0.查看本机公钥 步骤: 1.进入.ssh目录 cd ~/.ssh 2.找到id_rsa.pub文件 ls / ll 3.查看文件 cat id_rsa.pub JackFe ...