Python3多进程与多线程区别及使用(1.进程)
1 multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
import multiprocessing import osdef run_proc(name):print('Child process {0} {1} Running '.format(name, os.getpid()))if __name__ == '__main__':print('Parent process {0} is Running'.format(os.getpid()))for i in range(5):p = multiprocessing.Process(target=run_proc, args=(str(i),))print('process start')p.start()p.join()print('Process close') 结果:Parent process 5408 is Runningprocess startprocess startprocess startprocess startprocess startChild process 0 1044 Running Child process 1 1120 Running Child process 3 10824 Running Child process 2 9292 Running Child process 4 10528 Running
pool=Pool(numprocess,initializer,initargs) numproxess:需要创建的进程个数,如果忽略将使用cpu_count()的值。即系统上的CPU数量。 initializer:每个进程启动时都要调用的对象。 initargs:为initalizer传递的参数。
apply_async(要调用的方法,参数列表,关键字参数列表):使用非阻塞方式调用指定方法,并行执行(同时执行)apply(要调用的方法,参数列表,关键字参数列表):使用阻塞方式调用指定方法,,阻塞方式就是要等上一个进程退出后,下一个进程才开始运行。close():关闭进程池,不再接受进的进程请求,但已经接受的进程还是会继续执行。terminate():不管程任务是否完成,立即结束。join():主进程堵塞(就是不执行join下面的语句),直到子进程结束,注意,该方法必须在close或terminate之后使用。pool.map(func,iterable,chunksize):将可调用对象func应用给iterable的每一项,然后以列表形式返回结果, 通过将iterable划分为多块,并分配给工作进程,可以并行执行。chunksize指定每块中的项数, 如果数据量较大,可以增大chunksize的值来提升性能。pool.map_async(func,iterable,chunksize,callback):与map方法不同之处是返回结果是异步的, 如果callback指定,当结果可用时,结果会调用callback。pool.imap(func,iterable,chunksize):与map()方法的不同之处是返回迭代器而非列表。pool.imap_unordered(func,iterable,chunksize):与imap()不同之处是:结果的顺序是根据从工作进程接收到的时间而定的。pool.get(timeout):如果没有设置timeout,将会一直等待结果, 如果设置了timeout,超过timeout将引发multiprocessing.TimeoutError异常。pool.ready():如果调用完成,返回Truepool.successful():如果调用完成并且没有引发异常,返回True,如果在结果就绪之前调用,将引发AssertionError异常。pool.wait(timeout):等待结果变为可用,timeout为等待时间。
import multiprocessing import os import time def run_task(name):print('Task {0} pid {1} is running, parent id is {2}'.format(name, os.getpid(), os.getppid()))time.sleep(1)print('Task {0} end.'.format(name)) if __name__ == '__main__':print('current process {0}'.format(os.getpid()))#设定池内进程数p = multiprocessing.Pool(processes=3)for i in range(6):p.apply_async(run_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()print('All processes done!')
current process 562 Task 0 pid 778 is running, parent id is 562 Task 1 pid 779 is running, parent id is 562 Task 2 pid 780 is running, parent id is 562 Waiting for all subprocesses done... Task 1 end. Task 0 end. Task 2 end. Task 3 pid 779 is running, parent id is 562 Task 4 pid 778 is running, parent id is 562 Task 5 pid 780 is running, parent id is 562 Task 4 end. Task 5 end. Task 3 end. All processes done!
apply(func[,args[,kwds]]))
import multiprocessing import os import time def run_task(name):print('Task {0} pid {1} is running, parent id is {2}'.format(name, os.getpid(), os.getppid()))time.sleep(1)print('Task {0} end.'.format(name)) if __name__ == '__main__':print('current process {0}'.format(os.getpid()))p = multiprocessing.Pool(processes=3)for i in range(6):p.apply(run_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()print('All processes done!')
current process 562 Task 0 pid 785 is running, parent id is 562 Task 0 end. Task 1 pid 786 is running, parent id is 562 Task 1 end. Task 2 pid 787 is running, parent id is 562 Task 2 end. Task 3 pid 785 is running, parent id is 562 Task 3 end. Task 4 pid 786 is running, parent id is 562 Task 4 end. Task 5 pid 787 is running, parent id is 562 Task 5 end. Waiting for all subprocesses done... All processes done!
from multiprocessing import Process, Queue import os, time, random # 写数据进程执行的代码: def proc_write(q,urls):print('Process(%s) is writing...' % os.getpid())for url in urls:q.put(url)print('Put %s to queue...' % url)time.sleep(random.random()) # 读数据进程执行的代码: def proc_read(q):print('Process(%s) is reading...' % os.getpid())while True:url = q.get(True)print('Get %s from queue.' % url) if __name__=='__main__':# 父进程创建Queue,并传给各个子进程:q = Queue()proc_writer1 = Process(target=proc_write, args=(q,['url_1', 'url_2', 'url_3']))proc_writer2 = Process(target=proc_write, args=(q,['url_4','url_5','url_6']))proc_reader = Process(target=proc_read, args=(q,))# 启动子进程proc_writer,写入: proc_writer1.start()proc_writer2.start()# 启动子进程proc_reader,读取: proc_reader.start()# 等待proc_writer结束: proc_writer1.join()proc_writer2.join()# proc_reader进程里是死循环,无法等待其结束,只能强行终止:proc_reader.terminate()
multiprocessing.Pipe([duplex])
from multiprocessing import Process, Pipe def send(pipe):pipe.send(['spam',42, 'egg']) # send 传输一个列表 pipe.close() if __name__ == '__main__':(con1, con2) = Pipe() # 创建两个 Pipe 实例sender = Process(target=send, args=(con1, )) # 函数的参数,args 一定是实例化之后的 Pip 变量,不能直接写 args=(Pip(),)sender.start() # Process 类启动进程print("con2 got: %s" % con2.recv()) # 管道的另一端 con2 从send收到消息con2.close()
结果
con2 got: ['spam', 42, 'egg']
from multiprocessing import Process, Pipedef talk(pipe):pipe.send(dict(name='Bob', spam=42)) # 传输一个字典reply = pipe.recv() # 接收传输的数据print('talker got:', reply)if __name__ == '__main__':(parentEnd, childEnd) = Pipe() # 创建两个 Pipe() 实例,也可以改成 conf1, conf2child = Process(target=talk, args=(childEnd,)) # 创建一个 Process 进程,名称为 childchild.start() # 启动进程print('parent got:', parentEnd.recv()) # parentEnd 是一个 Pip() 管道,可以接收 child Process 进程传输的数据parentEnd.send({x * 2 for x in 'spam'}) # parentEnd 是一个 Pip() 管道,可以使用 send 方法来传输数据child.join() # 传输的数据被 talk 函数内的 pip 管道接收,并赋值给 replyprint('parent exit')
结果:
parent got: {'name': 'Bob', 'spam': 42} talker got: {'pp', 'mm', 'aa', 'ss'} parent exit
转载于:https://www.cnblogs.com/IMWU/p/10855709.html
Python3多进程与多线程区别及使用(1.进程)相关推荐
- 多进程与多线程区别、优缺点(Python)
多进程 在Linux系统下,使用os.fork(), 调用一次,返回两次,操作系统自动把当前进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回.子进程永远返回0,父进程返回子进程的ID ...
- python多进程和多线程一起使用_Python3多进程与多线程区别及使用(2.线程)
threading模块 简述: threading模块 threading.currentThread(): 返回当前的线程变量. threading.enumerate(): 返回一个包含正在运行的 ...
- 黑马毕向东Java课程笔记(day11):多线程(第一部分)——进程与线程+线程创建+线程安全与同步代码块+同步锁/死锁
多线程好文:添加链接描述 锁机制:synchronized.Lock.Condition.volatile(原子性可见性)--参考添加链接描述 1.进程与线程概述 首先,对于CPU执行每一个程序, ...
- 多进程和多线程的区别
多线程和多进程的区别(重点 必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催) ...
- 多进程与多线程的区别 - jihite
多进程与多线程的区别 - jihite 时间 2014-03-16 10:16:00 博客园-所有随笔区 原文 http://www.cnblogs.com/kaituorensheng/p/360 ...
- Python多任务(8.进程与线程之间的区别以及多进程和多线程的区别 )
1. 进程.线程的对比 进程,能够完成多任务,比如: 一台电脑上可以运行登录多个QQ 线程,能够完成多任务,比如: 一个QQ中可以和有多个聊天窗口 进程里面包含线程,线程不能够独立执行,必须依存在进 ...
- 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别
当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位. 3.一个进程可以包括多个线程. 4.在单CPU计算 ...
- Spark 和 MR 的区别: 多进程与多线程模型
精选30+云产品,助力企业轻松上云!>>> 先说结论:Hadoop MapReduce采用了多进程模型,而Spark采用了多线程模型 接下来,来一起分析,这两种模式的区别以及优缺点: ...
- 多进程和多线程的区别_关于多进程和多线程的那些事儿
1. 引言 只有真正写过操作系统内核的人,比如大神Linus才能真正理解进程和线程的区别与联系,像我们学过操作系统课程的人都知道进程和线程的基本概念,但是仅仅是懂个皮毛而已.所以我也是纸上谈兵,根据理 ...
最新文章
- 写给程序员的最好的13条建议
- .NET:动态代理的 “5 + 1” 模式
- html 屏蔽蓝色电话,html – 在Chrome扩展程序中停用文字字段蓝色突出显示?
- 【GAN优化】小批量判别器如何解决模式崩溃问题
- 怎么使用config?
- Oracle Connect By Start With 总结==转帖
- RabbitMQ交换器Exchange介绍与实践
- android locknow,java – Android DevicePolicyManager lockNow()
- 数据的转换(shp sde mdb 之间的转换)
- Android 的蓝牙简介
- n9100 分区 Linux,​史上最全的三星N9100官方固件
- garbor 特征 matlab,Gabor小波滤波用于纹理特征提取
- 引用 康奈尔大学剪影
- 计算机电源简单知识,基本知识:电脑电源工作流程以及电路图赏析
- Thingsboard Build踩坑(一)
- 网易我的世界服务器加载无响应,我的世界网易版开始游戏没反应
- CentOS 7 搭建 docker+vulhub(漏洞测试靶场)
- 第十五届东北四省大学生程序设计大赛J. Transform(计算几何,罗德里格斯旋转公式)
- java版MC城市地图
- 现在使用计算机器工作原理,计算机显示器工作原理(17页)-原创力文档
热门文章
- 你们期待的小屏旗舰来了: 骁龙855 没有刘海!
- 【点阵液晶编程连载三/B】点阵LCD 的驱动与显控
- 每个程序猿必读的10篇文章
- rtmp服务器 协议之同步
- python回溯方法的模板_实例讲解Python基于回溯法子集树模板实现图的遍历功能
- 查询端口号是否被占用指令
- drawforeground只有鼠标事件进入才刷新_为什么移动鼠标会让操作系统跑得更快?...
- 【Flink】Flink flink-runtime.version.properties generated correctly. You MUST run mvn generate-source
- 【es】使用ElasticSearch的44条建议 性能优化
- 【ElasticSearch】Es 源码之 IngestService 源码解读