【python】多进程、多线程、序列
一、多进程
1.子进程永远返回0
,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()
就可以拿到父进程的ID。
2.multiprocessing
multiprocessing
模块提供了一个Process
类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束
1 import os,time,random 2 from multiprocessing import Process 3 #运行多个子进程 4 def run_child_process(name): 5 print("run child process %s(%s)"%(name,os.getpid())) 6 7 if __name__=='__main__': 8 print("parent process %s"%os.getpid()) 9 p1=Process(target=run_child_process,args=("p1",)) 10 p1.start() 11 p1.join() 12 print("child process end")
3.进程池 pool
如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
1 from multiprocessing import Pool 2 import os,time,random 3 def long_time_task(name): 4 print("run task %s(%s)"%(name,os.getpid())) 5 start=time.time() 6 time.sleep(random.random()*3) 7 end=time.time() 8 print("task %s takes %0.2f seconds"%(name,(end-start))) 9 10 if __name__=='__main__': 11 print("parent process %s"%os.getpid()) 12 p=Pool(4) #pool的默认值是cpu数 13 for i in range(5): 14 p.apply_async(long_time_task,args=(i,)) 15 print("waiting for all subprocess done") 16 p.close() 17 p.join() 18 print("all subprocess done")
执行结果:
Parent process 4984. Waiting for all subprocesses done... Run task 3 (9496)... Task 3 runs 1.65 seconds. Run task 4 (9496)... Task 4 runs 0.16 seconds. Run task 0 (11036)... Task 0 runs 2.25 seconds. Run task 2 (8680)... Task 2 runs 2.67 seconds. Run task 1 (11100)... Task 1 runs 2.97 seconds. All subprocesses done. [Finished in 3.7s]
二、多线程
多任务可以由多进程完成,也可以由一个进程内的多线程完成。
我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程
1.启动线程
1 import threading,time 2 def loop(): 3 print("thread %s is running..."%threading.current_thread().name) 4 n=0 5 while n<5: 6 n=n+1 7 print("thread %s>>>%s"%(threading.current_thread().name,n)) 8 time.sleep(1) 9 print("thread %s is ended"%threading.current_thread().name) 10 print("thread %s is running"%threading.current_thread().name) 11 t=threading.Thread(target=loop,name="loopthread") 12 t.start() 13 t.join() 14 print("thread %s is ended"%threading.current_thread().name)
执行结果:
1 thread MainThread is running 2 thread loopthread is running... 3 thread loopthread>>>1 4 thread loopthread>>>2 5 thread loopthread>>>3 6 thread loopthread>>>4 7 thread loopthread>>>5 8 thread loopthread is ended 9 thread MainThread is ended 10 [Finished in 5.3s]
2.lock
多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了
1 import time,threading 2 balance=0 3 lock=threading.Lock() 4 def change_it(n): 5 global balance 6 balance=balance+n 7 balance=balance-n 8 9 def run_thread(n): 10 for i in range(100000): 11 lock.acquire() 12 try: 13 change_it(n) 14 finally: 15 lock.release() 16 t1=threading.Thread(target=run_thread,args=(5,)) 17 t2=threading.Thread(target=run_thread,args=(8,)) 18 t1.start() 19 t2.start() 20 t1.join() 21 t1.join() 22 print(balance)
三、队列
1.Process
之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing
模块包装了底层的机制,提供了Queue
、Pipes
等多种方式来交换数据。
我们以Queue
为例,在父进程中创建两个子进程,一个往Queue
里写数据,一个从Queue
里读数据:
1 from multiprocessing import Process, Queue 2 import os, time, random 3 # 写数据进程执行的代码: 4 def write(q): 5 print('Process to write: %s' % os.getpid()) 6 for value in ['A', 'B', 'C']: 7 print('Put %s to queue...' % value) 8 q.put(value) 9 time.sleep(random.random()) 10 11 # 读数据进程执行的代码: 12 def read(q): 13 print('Process to read: %s' % os.getpid()) 14 while True: 15 value = q.get(True) 16 print('Get %s from queue.' % value) 17 18 if __name__=='__main__': 19 # 父进程创建Queue,并传给各个子进程: 20 q = Queue() 21 pw = Process(target=write, args=(q,)) 22 pr = Process(target=read, args=(q,)) 23 # 启动子进程pw,写入: 24 pw.start() 25 # 启动子进程pr,读取: 26 pr.start() 27 # 等待pw结束: 28 pw.join() 29 # pr进程里是死循环,无法等待其结束,只能强行终止: 30 pr.terminate()
原文地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000
https://yuedu.baidu.com/ebook/0f6a093b7dd184254b35eefdc8d376eeaeaa17e3?pn=1&rf=https%3A%2F%2Fyuedu.baidu.com%2Febook%2F0f6a093b7dd184254b35eefdc8d376eeaeaa17e3
转载于:https://www.cnblogs.com/dhs94/p/9005336.html
【python】多进程、多线程、序列相关推荐
- python多进程多线程,多个程序同时运行
python 多线程 多进程同时运行 多任务要求 python 基础语法 python 文件目录操作 python 模块应用 开发工具 pycharm 实现方法 多任务的实现可以用进程和线程来实现 进 ...
- python多进程、多线程
1.python多线程 使用一个例子来学习多线程.建议自己敲一遍. python多线程是通过threading模块的Thread实现. 创建线程对象 t = thread.Thread() 启动线程 ...
- Python 多进程开发与多线程开发
我们先来了解什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...
- python 多进程_说说Python多线程与多进程的区别?
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...
- 一文看懂Python多进程与多线程编程(工作学习面试必读)
进程(process)和线程(thread)是非常抽象的概念, 也是程序员必需掌握的核心知识.多进程和多线程编程对于代码的并发执行,提升代码效率和缩短运行时间至关重要.小编我今天就来尝试下用一文总结下 ...
- python 多进程和多线程
python 多进程和多线程 一.进程和线程 1.概念 进程: 一个进程就是一个任务,可以理解为一个程序.一个进程可以有多个线程,至少一个.多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影 ...
- Python实现多进程/多线程同时下载单个文件
功能描述: 使用多进程/多线程同时下载单个文件,可以自定义文件地址.进程/线程数量. 主要思路: 获取文件大小,使用多个进程/线程分别下载一部分,最后再把这些文件拼接起来. 参考代码: 运行结果: - ...
- python随笔系列--多进程多线程并发度初探
大家都知道python中由于GIL这把大锁的存在,导致python的多线程并不是真正的多线程(不同于java等语言).首先了解下GIL导致的现象:同一时间只能有一个线程占有python解释器(或者,同 ...
- 关于python的多线程和多进程_Python的多线程和多进程
(1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...
- 【干货】python多进程和多线程谁更快
python多进程和多线程谁更快 python3.6 threading和multiprocessing 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为G ...
最新文章
- Elasticsearch增删改查
- Cisco3750在多VLAN网络环境下DHCP的实现
- strapi 开源api 内容管理平台试用
- 46. Ext中namespace的作用(转)
- python线程与进程视频教程_[PYTHON系列教程]→进程 vs. 线程
- sql的limit用法
- 【复杂系统迁移 .NET Core平台系列】之调度服务改造
- 10万辅导老师困境:上半年被抢,下半年被裁
- 201621123053《Java程序设计》第十一周学习笔记文章
- 如何退出while(cinvalue)的循环
- 【8.16校内测试】【队列】【数学】【网络流/二分图最大匹配】
- SpringBoot高级篇-属性配置
- matlab许可证_MATLAB校园许可证更新指南
- 浅谈个人对读书的看法
- 人脸特征点定位方法DEST, 基于VS2019+OpenCV3.4.6
- 台风怎么看内存颗粒_光威TYPE普通马甲内存条,南亚ADIE HR颗粒稳超3200MHZ
- python安装requirement.txt的扩展包
- Redis Geospatial地理位置
- Fan996餐饮外卖平台小程序 V1.0.1正式版
- Binggo公开课 “CODEX创新体系”的实战演练-中关村创业大街
热门文章
- 在Idea2017.1中编译时发生如下的错误
- 一个存储交流的报告——闪存存储系统设计
- Jabber 创建一个application dial rule
- Android Screen Orientation
- contentType,charset和pageEncoding的区别
- mysql强制编码导出、导入数据
- 详析Exchange 2007/2010 SSL证书如何安装
- 我的 WinClock 项目系列之一 (概述)
- 【Vegas2006】8月11日-咖啡生活
- (其他)用sublime text3编写的html网页用浏览器打开出现中文乱码的原理及解决方法(转)...