python3 进阶---多线程和锁

1.首先了解几个概念

(1)并发:多个任务同时进行,但是同一时刻只能处理一个任务,只有一个处理器,是逻辑意义上的同时发生

(2)并行:多个任务同时进行,而且在同一时刻是同时在执行的,有多个处理器,是物理意义上的同时发生

(3)进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位

(4)线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位

(5)一个进程至少包括一个线程

2.线程的创建与调用

# -*-coding:utf-8 -*-

import threading
import time

start_time = time.time()


def foo(name):
    start = time.time()
    print("hello %s" % name)
    time.sleep(2)
    end = time.time()
    cost_time = end - start
    print(cost_time)


# 创建线程
# target参数指向要执行的函数名
# args参数指向要执行的函数的参数,元组或者列表都可以
threading1 = threading.Thread(target=foo, args=("小明",))
threading2 = threading.Thread(target=foo, args=("小红",))

# 启动线程
threading1.start()
threading2.start()

# 堵塞主线程:线程.join(),直到当前线程运行结束才会继续运行主线程
# threading1运行完才会继续执行主线程
threading1.join()
# threading1运行完才会继续执行主线程
threading2.join()

end_time = time.time()

print("total time:", end_time - start_time)

3.守护线程

(1)通过t1.setDaemon(True) 设置线程t1为守护线程

(2)守护线程在主线程结束之后会随之结束,不会再继续执行

(3)守护线程需要在线程启动之前设置

# -*-coding:utf-8 -*-

"""
守护线程:主线程结束,子线程也跟着结束
"""

import threading
import time

def foo():
    while True:
        print("生产了一个数据")
        time.sleep(1)

t1 = threading.Thread(target=foo)
# 守护线程必须在启动之前设置
# 主线程结束,t1跟着结束
t1.setDaemon(True)
t1.start()

print("主线程结束。。。。。")

 

4.同步锁

(1)创建同步锁:lock=threading.Lock()

(2)同步锁上锁和解锁必须成对出现,否则会出现问题

(3)上锁:lock.acquire(),重要数据操作之前上锁

(4)解锁:lock.release(),重要数据操作之后解锁

5.死锁

线程死锁:多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

处理方式:

(1)递归锁:不同任务之间的线程用递归锁

         lock_R = threading.RLock()

        # 递归锁内部维护着一个计算器

        # 每次上锁,计数器+1

        # 每次解锁,计算器-1

        # 计数器必须>=0

(2)同步锁:同一个任务之间的线程用同步锁

 

猜你喜欢

转载自blog.csdn.net/qq_19982677/article/details/108287958