6 线程threading

1.第1种方式:threading模块

  1)单线程执行

#-*- coding:utf-8 -*-
import time

def main():
    print("我错了。。。")
    time.sleep(1)


if __name__ == "__main__":
    start_time = time.time()
    for i in range(5):
        main()
    end_time = time.time()
    print("the run time is %s"%(end_time-start_time))

    

  2)多线程执行

  • 主线程会等待所有的子线程结束后才结束

#-*- coding:utf-8 -*-
from threading import Thread
import time

#1.如果多个线程执行的都是同一个函数的话,各自之间不会有影响,各是各的
def main():
    print("我错了。。。")
    time.sleep(1)


if __name__ == "__main__":
    start_time = time.time()
    for i in range(5):
       # Process(target=test)  Process进程完成多任务
       t = Thread(target=main)
       t.start()

    end_time = time.time()
    print("the run time is %s"%(end_time-start_time))

    

 

2.线程和进程的区别联系

  • 进程是资源分配的单位,资源,内存,屏幕,等
  • 线程是cpu调度的单位

       

  •  1个进程内有1个主线程,主线程可以创建多个子线程
  • 主线程任务完成,要等待子线程的任务完成

      

3.第2种方式:Thread子类创建线程

#coding=utf-8
import threading
import time

class MyThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(1)
            msg = "I'm "+self.name+' @ '+str(i) #name属性中保存的是当前线程的名字
            print(msg)


if __name__ == '__main__':
    t = MyThread()
    t.start()

      

4.僵尸进程,孤儿进程,0号1号进程

  1. 僵尸进程:子进程结束,父进程还没有给它收尸,此时的子进程成为僵尸进程
  2. 孤儿进程:父进程提前结束,没有等待子进程结束,此时的子进程成为孤儿进程
  3. 0号进程负责切换任务
  4. 1号进程负责生成,销毁 其他子进程

       

    

 5.线程的执行顺序:无序

  •  执行结果:(运行的结果可能不一样,但是大体是一致的)
#coding=utf-8
import threading
import time

class MyThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(1)
            msg = "I'm "+self.name+' @ '+str(i)
            print(msg)
def test():
    for i in range(5):
        t = MyThread()
        t.start()
if __name__ == '__main__':

    

  • python解释器会屏蔽底层硬件的差异

    

6. 总结

  1. 每个线程一定会有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。
  2. 当线程的run()方法结束时该线程完成。
  3. 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。
  4. 线程的几种状态

    

原文地址:https://www.cnblogs.com/venicid/p/7966129.html