线程

 

 

一、线程定义:

  •   进程:资源单位(起一个进程,仅仅是在内存空间中开辟一块独立的空间)
  •   线程:执行单位(真正被cpu执行的是进程里面的线程,线程是指代码的执行过程,执行代码中所需要的资源都在所在的进程内索要)
  •   操作系统为工厂,进程为车间(物料、辅料),线程为流水生产线(对物料或辅料进行加工)。
  •   每一个进程至少带一个线程
  •   进程和线程都是虚拟名称,只是为了更方便的描述问题。

二、为何要有线程:

  •   开设进程:
  1.     申请内存空间
  2.     拷贝代码
  •   开设线程:

    开设新线程不需要开辟内存空间,

  •   总结:线程的开销远远小于进程的开销;同一个线程下的数据是共享的。(相当于几条流水线在同一个车间)

三、如何使用线程:

 

  • 开启线程的两种方式
  • tcp服务端实现并发的效果
  • 线程对象的join方法
  • 线程间数据共享
  • 线程对象属性及其它方法
  • 守护线程
  • 线程互斥锁
  • GIL全局解释器锁
  • 多进程与多线程的实际应用场景

01 开启线程的两种方式:

方式一:

from threading import Thread
from multiprocessing import Process
import time


def func(name):
    print("%s is running" % name)
    time.sleep(1)
    print("%s is over" % name)


if __name__ == '__main__':
    # t = Thread(target=func, args=("hector",))    
    p = Process(target=func, args=('hector',))   
    p.start()
    # t.start()
    print("main thread")

 总结:对比执行进程和线程可以发现开设进程因为开辟内存空间耗时,时间更长

方式二:

from threading import Thread
import time

class Mythread(Thread):
    def __init__(self, name):
        super().__init__()           # 重写父类的方法,这个是将父类的方法直接继承应用。
        self.name = name
    def run(self):
        print("%s is running" % self.name)
        time.sleep(1)
        print("%s is over" % self.name)

if __name__ == '__main__':
    t = Mythread("nico")
    t.start()                    #没有完全理解为什么这个地方是用start(),而不是使用run().在开进程的时候也面临这样的问题。
    print("main thread")

 

posted @ 2022-11-15 20:26  禾火123  阅读(41)  评论(0)    收藏  举报