day31

http://www.cnblogs.com/yuanchenqi/articles/5745958.html

由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。

多进程

 from multiprocessing import Process#进程
import time
def f(name):
time.sleep(1)
print('hello', name,time.ctime()) if __name__ == '__main__':
p_list=[]
for i in range(3):#和threading,差不多
p = Process(target=f, args=('alvin',))
p_list.append(p)
p.start()
for i in p_list:
p.join()
print('end') #延迟一秒后全部输出

延迟1面。输出。

执行结果:

/home/nizhipeng/PycharmProjects/learnPython/venv/bin/python /home/nizhipeng/PycharmProjects/learnPython/week8/多进程.py
hello alvin Mon Nov 5 22:25:45 2018
hello alvin Mon Nov 5 22:25:45 2018
hello alvin Mon Nov 5 22:25:45 2018
end Process finished with exit code 0

类式调用多线程

 from multiprocessing import Process
import time class MyProcess(Process):#继承
def __init__(self):
super(MyProcess, self).__init__()
#self.name = name 可以从新赋值 def run(self):
time.sleep(1)
print ('hello', self.name,time.ctime())#hello MyProcess-3 Mon Nov 5 21:20:11 2018 if __name__ == '__main__':
p_list=[]
for i in range(3):
p = MyProcess()
p.start()
p_list.append(p) for p in p_list:
p.join() print('end')

使用方式和threading多线程一样。

执行结果:

hello MyProcess-1 Mon Nov  5 22:27:51 2018
hello MyProcess-2 Mon Nov 5 22:27:51 2018
hello MyProcess-3 Mon Nov 5 22:27:51 2018
end Process finished with exit code 0

进程关系

 from multiprocessing import Process
import os
import time
def info(title):
print(title)#传入信息
print('module name:', __name__)#main
print('parent process:', os.getppid())#父进程号
print('process id:', os.getpid())#本进程号
#每一个进程都有根进程 def f(name):
info('\033[31;1mfunction f\033[0m')
print('hello', name) if __name__ == '__main__':
info('\033[32;1mmain process line\033[0m')
time.sleep(3)
p = Process(target=info, args=('bob',))#子进程 ,其父进程是主进程
p.start()
p.join()

执行结果:

main process line
module name: __main__
parent process: 4319
process id: 1896
bob
module name: __main__
parent process: 1896
process id: 1929 Process finished with exit code 0

从输出结果可以看出,子进程p的父进程号1896是主进程号1896。主进程的父进程号是4319。

每一个进程都有根进程

主进程与子进程通信Pipe

 from multiprocessing import Process, Pipe

 def f(conn):
conn.send([42, None, 'hello'])#其中conn,为其父进程的child_conn
conn.close() if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print(parent_conn.recv()) # prints "[42, None, 'hello']"#子进程发送,主进程接收
p.join()

执行结果:

[42, None, 'hello']

Process finished with exit code 0

manager实现数据共享

 from multiprocessing import Process, Manager
import threading
def f(d, l,n):
d[n] = ''#n 为0~1个线程,全赋为1
d[''] = 2
d[0.25] = None
l.append(n)
#print('l:', l) if __name__ == '__main__':
with Manager() as manager: #manager = manager()
d = manager.dict()#字典 l = manager.list(range(5))#初始值为零到四的列表 p_list = []
for i in range(10):
p = Process(target=f, args=(d, l, i))
#p = threading.Thread(target=f, args=(d, l, i)) #多线程
p.start()
p_list.append(p) for res in p_list:
res.join() print(d)
print(l)

执行结果:

{0.25: None, 1: '', 2: '', 3: '', '': 2, 5: '', 6: '', 7: '', 8: '', 9: '', 4: '', 0: ''}
[0, 1, 2, 3, 4, 1, 0, 6, 2, 3, 7, 4, 8, 9, 5] Process finished with exit code 0

d字典中,n 0~9,都赋值为1,其余按要求赋值。

列表l中,前五个初始为0~4,后十个值由于是多进程,排列顺序随机。

Python(多进程multiprocessing模块)的更多相关文章

  1. python多进程multiprocessing模块中Queue的妙用

    最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...

  2. python 多进程multiprocessing 模块

    multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 mult ...

  3. Python之multiprocessing模块的使用

    作用:Python多进程处理模块,解决threading模块不能使用多个CPU内核,避免Python GIL(全局解释器)带来的计算瓶颈. 1.开启多进程的简单示例,处理函数无带参数 #!/usr/b ...

  4. 多进程Multiprocessing模块

    多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...

  5. Python 多进程 multiprocessing.Pool类详解

    Python 多进程 multiprocessing.Pool类详解 https://blog.csdn.net/SeeTheWorld518/article/details/49639651

  6. python之多进程multiprocessing模块

    process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...

  7. python 3 并发编程之多进程 multiprocessing模块

    一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  8. python ---多进程 Multiprocessing

    和 threading 的比较 多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 ...

  9. 转 Python 多进程multiprocessing.Process之satrt()和join()

    1. https://blog.csdn.net/wonengguwozai/article/details/80325745 今天项目中涉及到了使用多进程处理数据,在廖雪峰的python教程上学习了 ...

随机推荐

  1. DB2中的数据类型

    DB2中的数据类型DB2内置数据类型可以分成数值型(numeric).字符串型(character string).图形字符串(graphic string).二进制字符串型(binary strin ...

  2. 记录如何用abd,用电脑输出手机操作信号

    0.http://www.wmzhe.com/soft-39913.html 去这里下载最新版的adb.旧版本很多不好使.一定最新的. 1.用豌豆荚装好驱动 2.开启usb调试.具体方法可以百度到 3 ...

  3. DB2分页查询SQL

    select * from (select row_number() over() as rown,tpag.* from(SELECT int(COALESCE(列名1,0)),COALESCE(列 ...

  4. 讲讲我在Windows10(uwp)开发中遇到的一些坑.

    7月29日发布的Windows10正式版,当天安装好以后,在网络不太好的情况下,经过多次尝试终于装上了Visual Studio 2015和Windows 10 10240的SDK.这两周一直在开发U ...

  5. 2081.09.22 Kuma(非旋treap)

    描述 有N张卡片,编号从0到n-1, 刚开始从0到n-1按顺序排好. 现有一个操作, 对于p. l,表示从第p张卡片之后的l张卡片拿到 最前面. 例如n=7的时候, 刚开始卡片序列为0 1 2 3 4 ...

  6. BeanUtils.populate的方法的作用

    BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下: 完整方法: BeanUtils.populate( Ob ...

  7. 揭开AutoRun功能的神秘面纱

    有很多光盘放入光驱就会自动运行,它们是怎么做到的呢?光盘一放入光驱就会自动被执行,主要依靠两个文件,一是光盘上的AutoRun.inf文件,另一个是操作系统本身的系统文件之一的Cdvsd.vxd.Cd ...

  8. 判断Mouse事件源类型

    //鼠标事件源类型 public enum MouseEventSource { Mouse, Pen, Touch } /// <summary> /// MainWindow.xaml ...

  9. 20155209 2016-2017-2 《Java程序设计》第八周学习总结

    20155209 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从J ...

  10. Linux操作系统文件系统基础知识详解

    一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上. 目录提供了管理文件的一个方便而有效的途径. Linux使用标准的目录结构,在安装的时候,安装 ...