一,线程与进程之间的关系:(从知乎上看到的)

一个必须知道的事实:执行一段程序代码,实现一个功能的过程介绍 ,当得到CPU的时候,相关的资源必须也已经就位,就是显卡啊,GPS啊什么的必须就位,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。

串联起来的事实:前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。。。

========= 重要的东西出现了========
进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。

  • 进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文

线程是什么呢?
进程的颗粒度太大,每次都要有上下的调入,保存,调出。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:

程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。

这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。

到此全文结束,再一个总结:

进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同,一个进程中包含了多个线程,在一个时间段内,只能有一个线程占用cpu,cpu不能同时执行多个任务,只不过cpu运行速度太快,我们感知不到,就以为,线程可以同时执行,对于多核cpu,实际也同一个时间段也只有一个cpu在工作

 
二,多线程,使用threading模块
一个简单的多线程
 
  1. import threading
  2.  
  3. import time
  4.  
  5. def axb(name):
  6. time.sleep(1)
  7. print(name)
  8. for i in range(10):
  9. t=threading.Thread(target=axb,args=(i,)) ##args 定义的是一个元组,必须加逗号,才能识别为元组
  10. t.start()
  11.  
  12. print('game over')

三,线程等待

线程等待,多线程在运行的时候,每个线程都是独立运行的,不受其他的线程干扰,如果想在哪个线程运行完之后,再做其他操作的话,就得等待它完成,那怎么等待呢,使用join,等待线程结束

  1.  
  1. import threading
    import time
    def run():
    print('qqq')
    time.sleep(1)
    print('done!')
    lis = []
    for i in range(5):
    t = threading.Thread(target=run)
    lis.append(t)
    t.start()
    for t in lis:
    t.join() #主线程等待子线程执行完
    print('over')
  1.  

四,获取多线程时执行结果的返回值

例如我们做接口测试时候,需要获取每个线程执行时间

  1. import threading
  2. import time
  3. import requests
  4. run_times = []
  5. #怎么获取到多线程执行的函数里面的返回值
  6. def blog():
  7. stat_time = time.time()
  8. r = requests.get('http://www.nnzhp.cn/').text
  9. end_time = time.time()
  10. run_time = end_time-stat_time
  11. run_times.append(run_time)
  12. objs = []
  13. for i in range(100):
  14. t = threading.Thread(target=blog())
  15. t.start()
  16. objs.append(t)
  17. for obj in objs:
  18. obj.join()#join中可以设置timeout时间,主线程等待时间超过timeout时间后就会继续执行,不再等待
  19. avg = sum(run_times)/len(run_times)
  20. print('平均响应时间是',avg)

五,守护线程:就相当于你是一个国王(非守护线程),然后你有很多仆人(守护线程),这些仆人都是为你服务的,一但你死了,那么你的仆人都给你陪葬。

  1. 主线程死掉了(执行完了),那么不管子线程运行完否,都一起结束
  1. import time
  2. import threading
  3.  
  4. def test():
  5. time.sleep(2)
  6. print('hhhh')
  7. for i in range(5):
  8. t=threading.Thread(target=test)
  9. t.setDaemon(True)#设置子线程为守护线程
  10. t.start()

程序执行结果不会打印 hhhh,因为主线程执行完的时候,子线程还没执行完,所以,主线程死掉了,守护子线程跟着消亡了

六、锁:线程锁就是,很多线程一起在操作一个数据的时候,可能会有问题,就要把这个数据加个锁,同一时间只能有一个线程操作这个数据。

  1. import threading
  2. from threading import Lock
  3.  
  4. num = 0
  5. lock = Lock() # 申请一把锁
  6.  
  7. def run():
  8. global num
  9. lock.acquire() # 加锁
  10. num += 1
  11. lock.release() # 解锁
  12.  
  13. lis = []
  14. for i in range(5):
  15. t = threading.Thread(target=run)
  16. t.start()
  17. lis.append(t)
  18. for t in lis:
  19. t.join()
  20. print('over', num)

七,多进程:Python里面的多线程,是不能利用多核CPU的,如果想利用多核CPU的话,就得使用多进程,python中多进程使用multiprocessing模块。

  1. from multiprocessing import Process
  2. import time
  3.  
  4. def test(i):
  5. time.sleep(1)
  6. print(i)
  7.  
  8. if __name__=='__main__':
  9. for i in range(10):
  10. p=Process(target=test,args=(i,))
  11. p.start()

threading与实例对象提供了几个方法可以让我们更直观的学习线程。

  1. threading.active_count() # 返回当前运行的线程个数
  2.  
  3. threading.enumerate() # 返回当前运行中的线程list
  4.  
  5. threading.current_thread() # 返回当前的线程变量
  6.  
  7. t1.start() # 启动线程
  8.  
  9. t1.is_alive() # 判断线程是否在运行 运行指启动后、终止前。
  10.  
  11. t1.getName() # 获取线程名
  12.  
  13. t1.setName('填写更改后的名称') # 对线程进行命名
  14.  
  15. t1.setDaemon(True) # 设置守护线程
  16.  
  17. t1.isDaemon() # 判断是否是守护线程
  18.  
  19. t1.join(timeout=20) # 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)

Python基础-多线程与多进程的更多相关文章

  1. py基础---多线程、多进程、协程

    目录 Python基础__线程.进程.协程 1.什么是线程(thread)? 2.什么是进程(process)? 3.进程和线程的区别 4.GIL全局解释器锁 5.多线程(threading模块) 6 ...

  2. Python之多线程和多进程

    一.多线程 1.顺序执行单个线程,注意要顺序执行的话,需要用join. #coding=utf-8 from threading import Thread import time def my_co ...

  3. Python的多线程和多进程

    (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...

  4. Python【多线程与多进程】

    import time,threading print("=======串行方式.并行两种方式调用run()函数=======")def run(): print('哈哈哈') # ...

  5. python的多线程、多进程代码示例

    python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...

  6. selenium +python之多线程与多进程应用于自动化测试

    多线程与多进程与自动化测试用例结合起来执行,从而节省测试用例的总体运行时间. 多线程执行测试测试用例 以百度搜索为例,通过不同的浏览器来启动不同的线程. from selenium import we ...

  7. Python之多线程与多进程(二)

    多进程 上一章:Python多线程与多进程(一) 由于GIL的存在,Python的多线程并没有实现真正的并行.因此,一些问题使用threading模块并不能解决 不过Python为并行提供了一个替代方 ...

  8. Python之多线程与多进程(一)

    多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...

  9. python的多线程和多进程(一)

    在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但任一时刻点上只有一个程序在处理 ...

随机推荐

  1. 打造一个高逼格的android开源项目——小白全攻略 (转)

    转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...

  2. 【Atheros】minstrel速率调整算法源码走读

    先说几个辅助的宏,因为内核不支持浮点运算,当然还有实现需要,minstrel对很多浮点值做了缩放: /* scaled fraction values */ #define MINSTREL_SCAL ...

  3. WPF使用X:Static做多语言支持

    让程序支持多语言,一般把需要显示的字符串保存在一个资源类的static属性中. <!--[if !supportLists]--> <!--[endif]--> 微软的WPF程 ...

  4. Mockito when(...).thenReturn(...)和doReturn(...).when(...)的区别

    在Mockito中打桩(即stub)有两种方法when(...).thenReturn(...)和doReturn(...).when(...).这两个方法在大部分情况下都是可以相互替换的,但是在使用 ...

  5. 二、Android应用的界面编程(一)界面编程与视图(View)组件

    Android应用的绝大部分UI组件都放在android.widget包及其子包.android.view包及其子包中,Android应用的所有UI组件都继承了View类.它代表一个空白的矩形区域.V ...

  6. 爬虫入门【7】Python-文件的读写和JSON

    文本文档的读写 最重要的open()方法将返回一个file对象,经常使用的两个参数为open(filename,mode) 其中,filename为file保存的地址,可以是本地地址,相对地址或者绝对 ...

  7. (比赛)B - 棋盘问题(dfs)

    B - 棋盘问题 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu Practice POJ ...

  8. config相关操作(转)

    转自:http://www.cnblogs.com/kissdodog/archive/2013/04/16/3025315.html,这是一个专题,感觉比较好,有空可以看与一下 System.Con ...

  9. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  10. jQuery实现复选框全选/所有取消/反选/获得选择的值

    <!DOCTYPE html> <html> <head> <script type="text/javascript" src=&quo ...