多任务--进程线程
2018-06-18 02:46:38来源:未知 阅读 ()
1、什么是线程(thread)?
线程是操作系统能够进行运算调度的最小单位,它包含在进程中,是进程中的实际运作单位。
一个进程可以并发多个线程,每条线程并行执行不同的任务。
简单理解:一一堆指令
2、什么是进程(process)?
正在进行的一个过程或一个任务,而执行任务的是CPU,进程是一个抽象的概念。
程序是菜谱,进程是做菜的过程。
3、线程和进程的区别
- 线程是执行的指令集,进程是资源的集合
- 启动速度:线程比进程快
- 运行速度:没有可比性
- 线程共享创建它的进程的内存空间,进程的内存是独立的
- 交互:同一个进程之间的线程可以进行交流,两个进程之家通信必须通过一个中间代理来实现
- 创建:新线程创建很简单,新进程创建需要克隆父进程
- 线程之间是平等的,没有隶属关系,可以控制和操作同一线程里的其他线程。但是进程只能操作子进程
4、同步和异步
同步:就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去
异步:是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
栗子:打电话的过程就是同步通信,发短信时就是异步通信
5、并行与并发
并行:具有处理多个任务的能力
并发:具有同时处理多个任务的能力
6、代码
001-单任务现象:
1 from time import sleep 2 def run(): 3 while True: 4 print("不运行") 5 sleep(1) 6 if __name__=="__main__": 7 while True: 8 print("王者小喵喵") 9 sleep(1.2) 10 #不会执行到run方法,只有循环结束才可以执行 11 run()
002-启动子进程实现多任务:
1 ''' 2 multiprocessing库 3 跨平台版本的多任务进程模块,提供了一个process类来代表一个进程对象 4 ''' 5 from multiprocessing import Process 6 from time import sleep 7 import os 8 9 # 子进程需要执行的代码 10 def run(str): 11 while True: 12 # os.getpid()获取当前进程ID号 13 # os.getppid()获取父进程标识 14 print("子进程启动--%s--%s"%(os.getpid(),os.getppid())) 15 print("飞车%s小喵喵"%str) 16 sleep(1) 17 if __name__ == "__main__": 18 print("父进程启动:--%s" % (os.getpid())) 19 p = Process(target=run, args=("nice",))# 创建子进程,target说明进程执行的任务。 20 p.start() # 启动子进程 21 while True: 22 print("王者小喵喵") 23 sleep(1)
执行结果:
父进程启动:--2020 王者小喵喵 子进程启动--10672--2020 飞车nice小喵喵 王者小喵喵 子进程启动--10672--2020 飞车nice小喵喵 王者小喵喵
003-子父进程执行的先后顺序
1 from multiprocessing import Process 2 import os 3 def run(): 4 print("子进程启动") 5 print("子进程结束") 6 if __name__=="__main__": 7 print("父进程启动") 8 p = Process(target=run) 9 p.start() 10 # 父进程的结束不影响子进程,让父进程等待子进程结束在执行父进程,p.join() 11 # p.join() 12 print("父进程结束")
执行结果:
父进程启动
父进程结束
子进程启动
子进程结束
004-全局变量在多进程中不共享
1 from multiprocessing import Process 2 from time import sleep 3 num = 100 4 def run(): 5 global num 6 print("子进程启动--%d" % num) 7 num += 1 8 print("子进程结束--%d"%num) 9 if __name__ == '__main__': 10 print("父进程启动--%d"%num) 11 p = Process(target=run) 12 p.start() 13 p.join() 14 # 在子进程中修改全局变量不影响父进程中的全局变量 15 # 在创建子进程时对全局变量做了一个备份,父进程与子进程中的num不是同一个 16 print("父进程结束--%d"%num)
执行结果:
父进程启动--100 子进程启动--100 子进程结束--101 父进程结束--100
005-启动大量子进程(进程池)
from multiprocessing import Pool import time,random,os def run(name): print('子进程%d启动--%s'%(name,os.getpid())) start=time.time() time.sleep(random.choice([1,2,3])) end=time.time() print('子进程%d结束--%s耗时%.2f'%(name,os.getpid(),end-start)) if __name__ == '__main__': print('父进程启动') pp=Pool(4) for i in range(4): pp.apply_async(run,args=(i,)) pp.close() pp.join() print('父进程结束')
执行结果:
父进程启动 子进程0启动--9684 子进程1启动--14044 子进程2启动--5972 子进程3启动--14096 子进程1结束--14044耗时1.00 子进程0结束--9684耗时2.00 子进程2结束--5972耗时2.00 子进程3结束--14096耗时3.00 父进程结束
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Mysql系列-数据库start
- Python连载30-多线程之进程&线程&线程使用 2019-08-13
- python多线程同步实例分析 2019-08-13
- xpath+多进程爬取八零电子书百合之恋分类下所有小说。 2019-08-13
- xpath+多进程爬取全书网纯爱耽美类别的所有小说。 2019-08-13
- 进程相关 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash