python-进程&线程

时间:2021-06-15 21:14:25

进程(process):相当于一个程序要运行时所需的所有资源的集合,相当于一个车间,不工作

两个进程之间的数据不共享,完全不独立,互相不能访问。

线程(thread):一道单一指令的控制流,寄生在进程中,相当于车间中的工人,工作。一个进程至少需要一个线程,这个线程为主线程,一个进程中可以有多个线程。

cpu的核数越多,代表可以并发的线程越多

一个进程中的不同线程共享数据,多线程在修改同一个数据时,一定要加锁

___线程___

  1、threading模块

       声明一个线程t=threading.Thread(target=线程函数名,args=(参数,))

    启动一个线程:t.start()

 import threading
def func1(n):
print('thread:%s'%n)
t=threading.Thread(target=func1,args=(i,))
t.start()

   2、实现多线程并发

           即同时启动多个线程,并发运行

import threading
import time
def func1(n):
time.sleep(8) #为了更直观的感受到并发效果~~
print('thread:%s'%n)
for i in range(30): #同时启动30个线程,并发
t=threading.Thread(target=func1,args=(i,))
t.start()

   3、线程的其他小方法

t.getName():取线程名 ,该名称是唯一的

t.setName('sefjsjfisojgiod') :设置线程名字,如果不设置,系统会自动起名

threading.active_count() :当前活跃的线程数

threading.current_thread():当前运行的线程实例

 import threading
import time
def run(n):
time.sleep(3)
print('thread',n)
print(threading.current_thread()) #打印当前运行的线程的实例
for i in range(10):
t=threading.Thread(target=run,args=(i,))
t.start()
t.setName('kasjdjakldjalsjdlasjdlsd%s'%i) #修改线程的名字,默认是Thread-i
print(t.getName()) #获取线程名,线程名是唯一的
print(threading.active_count()) #统计活跃的线程数

  4、线程等待

前面程序运行的时候,都是主线程启动和子线程之后,和子线程一起运行,那么如何实现主线程启动了子线程之后先不运行,等待子线程运行完毕之后(比如有些场景需要主线程拿到子线程的结果)再运行呢?????

线程等待:t.join()

 import threading
import time def run(n):
time.sleep(1)
print('thread',n)
t_list=[]
for i in range(10):
t=threading.Thread(target=run,args=(i,))
t.start()
t_list.append(t) #将启动的线程加入到有个列表中
for t in t_list:
t.join() # 等待所有线程运行完毕
print('))))))))))))))))))))))))))))))))))))))))')

注意:如果将t.join()加载t.start()之后,那么就不是并行运行了,变成了串行

  5、守护线程

前面主线程执行完毕,未执行的子线程仍继续执行,并不受主线程的影响,有些场景主线程完毕之后,子线程变没有意义了,那么如何让主线程执行完毕之后,子线程也停止执行,程序退出呢???

    场景举例:ftpserver为主线程,一个子线程的功能是断开很久没有活跃的连接,比如半小时这个连接没有活动,就将该链接断开。该子线程是一个独立的线程,如果主线程已经退出了,那么该子线程也没有存在的意义了。    怎么实现该子线程在主线程断开之后也停止运行呢????        将该子线程设置为主线程的守护线程就可以啦~~~

   t.setDaemon()

 import threading
import time
def run(n):
time.sleep(1)
print('thread:%s'%n)
for i in range(10):
t=threading.Thread(target=run,args=(1,))
t.setDaemon(True) # 启动线程之前,将线程设置为守护进程,则主线程结束后,子线程也结束,不会继续执行
t.start() print('hahhhahahahaha')