1、守护进程:
1.1、什么是守护进程?
1)、守护进程会在主进程代码运行结束的情况下,立即结束。
2)、守护进程本身其实就是一个子进程。
3)、主进程在其代码结束后已经运行完毕(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源才会结束。
1.2、为什么要用守护进程?
1)、守护进程本身就是一个子进程,所以在主进程需要将任务并发执行的时候需要开启子进程。
2)、当该子进程执行的任务生命周期伴随着主进程的生命周期时,就需要将该子进程做成守护进程。
2、守护线程(threading模块提供setDaemon(True)来使子线程变为守护线程)
1、守护线程会在"该进程内所有非守护线程全部都运行完毕后,守护线程才会结束"。不是主线程运行完毕后守护线程结束。(与守护进程的区别)
2、守护线程守护的是:当前进程内所有的子线程!
3、主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
守护线程和守护进程的区别:
守护进程是等待主进程代码结束之后就结束
守护线程是等待主线程都结束之后才结束
主线程等待其他线程结束,才结束
3、线程锁:
#如果有一个全局变量的话,那么在线程中是可以共享的,那么就会造成数据混乱的可能。这时候我们可以使用threadlocal,它本身也是一个全局的对象,但是它可以给每个线程创建一个局部变量。
import threading
import time
def run(n):
lock.acquire() #锁定
# print("task:",n)
global num
num+=1
# time.sleep(2)
# print("task done:",n)
lock.release() #释放锁
lock=threading.Lock() #创建锁
num=0
t_obj=[]
for i in range(50):
t=threading.Thread(target=run,args=("t-%s" % i,))
t.start()
t_obj.append(t)
for i in t_obj:
i.join()
time.sleep(2)
print("---all thread has finished")
print("num:",num)
4、进程锁:
# 例如:屏幕共享的时候,多进程可以同时使用屏幕,进程加锁的目的在于,确保屏幕被独个进程使用。
from multiprocessing import Lock,Process
def run(l,i):
l.acquire()
print(i)
l.release()
if __name__=="__main__":
lock=Lock()
for num in range(100):
Process(target=run,args=(lock,num)).start()
5、协程:
Generator函数
Generator函数的作用是一次产生一个数据项,并把数据输出,迭代性能更加
说明:generator函数的定义与普通函数的区别只是在函数体内使用yield生成数据项。Generator函数可以被for循环遍历,且可以通过__next__()方法获得yield生成的数据项。
格式:def 函数名(参数列表):
……
Yield表达式
迭代器对象:是一个“惰性对象”,通过调用它自身的__next__()方法或者next()系统函数获得迭代器中的下一个元素。
实现了__iter__()和__next__()方法的对象都是迭代器
使用iter()系统函数可以将一个可迭代对象转换成迭代器对象
可迭代对象:能被for循环遍历的对象
迭代器:既能被for循环遍历,还可以通过调用next()系统函数获取下一个元素,或者调用迭代器本身的__next__()方法