python线程锁、守护线程,进程锁、守护进程

本文深入探讨了守护进程和守护线程的概念及其在主进程结束时的行为差异,解释了为何使用守护进程,并介绍了如何利用Python的threading模块将线程设置为守护线程。此外,还讲解了线程锁和进程锁的使用场景,以及协程和Generator函数在提高迭代性能上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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__()方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值