第十二篇:线程和进程

Posted littlefivebolg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二篇:线程和进程相关的知识,希望对你有一定的参考价值。

 

  本篇先介绍多任务的概念、随后介绍关于threading模块下thread类创建子线程的流程以及理解,最后关于互斥锁。死锁以及如何避免死锁等知识。而关于进程在下一篇进行介绍。

一、概念

  在了解多任务或者线程等知识之前,我们首先需要对一些概念性知识有一定的了解。

  1、时间片轮转

  假如终端为单核CPU,而同时我又想同时运行多个程序,通常我们能看到单核的CPU也能同时运行多个程序,那是由于操作系统对CPU调用进行分配时,每个程序占用CPU的时间很短很短,接着便开始下一个程序的运行,周而复始的运行这些程序,由于每个程序占用CPU的时间特别短故呈现给我们的现象是:多个程序同时运行的假象。

  2、并发

  当CPU的数量小于运行程序的数量时,无法是实现真正意义上的每个程序的同时运行,故还是利用时间片轮转原理制造每个程序同时运行的假象,即为并发。

    技术分享图片

 

  3、并行

  当CPU的数量大于等于运行程序的数量时,可以实现每个程序一直均占有一个CPU,实现真正意义上的每个程序同时运行,即为并行。

  4、主线程

  当我们执行一段程序时,会有一条类似流水线的流程,按照程序的执行顺序不断执行,而在执行的过程主线程可以创建子线程,而通常而言主线程会等所有子线程均运行完才会结束运行,若主线程死掉,所有的子线程也会被杀死。

  5、子线程

  子线程可以通过主线程创造,同时子线程运行结束或者被杀死,不会影响主线程的执行。

 

二、线程

  1、为什么要有线程?我们从例子开始查看:

技术分享图片
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time

def sing():#  唱歌
    for i in range(3):
        print("he is singing song..")
        time.sleep(1)

def dance():  #跳舞
    for i in range(3):
        print("he is dancing..")
        time.sleep(1)


def main():
    sing()
    dance()


if __name__=="__main__":
    main()
01-没有多线程的情况下

  注:从上面的例子可以看出:在没有多线程的情况下,只能先唱完歌再进行跳舞,然而我们要实现的是边唱歌边跳舞

 

技术分享图片
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import threading

def sing():
    """唱歌"""
    for i in range(3):
        print("he is singing song..")
        time.sleep(1)


def dance():
    """跳舞"""
    for i in range(3):
        print("he is dancing..")
        time.sleep(1)


def main():
    # 1.创建子线程对象,并且指定子线程的工作函数
    # 即相当于 公司招了个员工,告诉他需要干的活
    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)

    # 2、子线程运行,并工作函数开始工作
    # 相当于该员工开始工作
    t1.start()
    t2.start()

    # 3、主线程等子线程运行完才关闭
    t1.join()
    t2.join()


if __name__=="__main__":
    main()
02-在有多线程的情况下

  注:通过上述例子可以得出:通过多任务的实现了唱歌的同时也进行了跳舞。

  

  2、创建线程的流程是怎么样的?

import time,threading

def sing():
    for i in range(3):
        print("he is singing song..")
        time.sleep(1)


def dance():
    for i in range(3):
        print("he is dancing..")
        time.sleep(1)


def main():
    # 1.创建子线程对象,并且指定子线程的工作函数
    # 即相当于 公司招了个员工,告诉他需要干的活
    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)

    # 2、子线程运行,并工作函数开始工作
    # 相当于该员工开始工作
    t1.start()
    t2.start()

    # 3、主线程等子线程运行完才关闭
    t1.join()
    t2.join()

#注:通过多任务的实现了唱歌的同时也进行了跳舞。
if __name__=="__main__":
    main()

  个人理解:

注:其实主线程和子线程的关系我们可以理解为:

1、主线程相当于一个公司的运转,而子线程相当于该公司下的一个员工正在进行的工作;

2、创建子线程的过程即t1=threading.Thread(target=func_name,args=(para1,para2..),我们可以理解为该公司雇佣了新的员工;而target=func_name,相当于告诉该员工他需要干的活是什么即传入功能函数;

3、而t1.start(),则表示该子线程真正运行,功能函数被调用,该过程可以理解为员工开始干活了,即员工的工作才是子线程,而员工本身仅仅是子线程对象。

 

 

  

 


以上是关于第十二篇:线程和进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux从青铜到王者第十二篇:Linux进程间信号第二篇

秒杀多线程第十二篇 多线程同步内功心法——PV操作上

第十二篇:并发回射服务器的具体实现及其中僵尸子进程的清理( 上 )

嵌入式Linux从入门到精通之第十二节:线程

Python第十二章-多进程和多线程01-多进程

第十二篇:为用户设计良好的接口