多任务--进程线程

2018-06-18 02:46:38来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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('父进程结束')
View Code

执行结果:

父进程启动
子进程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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Django学习笔记3-静态文件调用

下一篇:Mysql系列-数据库start