当前位置: 首页 > 科技观察

Python多线程编程初体验

时间:2023-03-14 19:37:06 科技观察

前言这将是一个系列,一个关于进程、线程和协程的系列。主要用于:回顾和复习以前学过的知识,希望这次经历可以帮助到正在学习编程的你查看线程ID创建文件0809.pyimporttimeimportthreadingdefloop():whileTrue:print('threadidis{}'.format(threading.get_native_id()))time.sleep(3)if__name__=='__main__':loop()在第一个终端窗口执行$python0809.pythreadidis3344threadidis3344threadidis3344在第二个终端窗口执行ps-ef|grep'python0809.py'vagrant33443117016:26pts/100:00:00python0809.pyvagrant36623451016:30pts/000:00:00grep--color=autopython0809.py你会发现进程ID也是3344,线程ID一致。这是因为Linux规定当一个进程只有一个线程时,线程ID等于进程ID。也就是说,进程的第一个线程(主线程)的ID等于进程ID。经典生产者/消费者模型(也称为发布/订阅模型)#0809.pyimporttimeimportthreadingcount=0defconsumer():globalcountwhileTrue:ifcount<=0:continuecount=count-1print(f'countis{count},consumerthreadidis{threading.get_native_id()}')time.sleep(2)defproducer():globalcountwhileTrue:count=count+1print(f'countis{count},producerthreadidis{threading.get_native_id()}')time.sleep(1)if__name__=='__main__':tp=threading.Thread(target=producer)tc=threading.Thread(target=consumer)tp.start()tc.start()执行命令python0809.py$python0809.pycountis1,producerthreadidis3785countis0,consumerthreadidis3786countis1,producerthreadidis3785countis0,consumerthreadidis3786countis1,producerthreadidis3785countis2,producerthreadidis3785countis1,consumerthreadidis3786countis2,producerthreadidis3785可以发现两个线程并不是严格交替执行,而是随机执行。我们再查看一下相关的进程和线程$ps-ef|grep'python0809.py'vagrant37843117017:24pts/100:00:00python0809.pyvagrant37893451017:24pts/000:00:00grep--color=autopython0809.py$ps-T-p3784PIDSPIDTTYTIMECMD37843784pts/100:00:00python37843785pts/100:00:00python37843786pts/100:00:00python可以看出进程中一共有三个线程,分别是主线程3784和两个子线程3785(生产者)、3786(消费者))今天我们先说到这里,重点关注:1.如何在python代码和shell终端中查看线程id、进程id、进程中包含的线程。2.了解生产/消费者模型,因为这个模型在接下来的学习中会多次提到