python高级 -- 多线程

1.1 获取线程数

import threading
import time
def fun():
    time.sleep(1)
    print("hello")
t = threading.Thread(target=fun)
t.start()
# print(threading.enumerate())
while True:
    leng = len(threading.enumerate())
    print("num%d" % leng)
    time.sleep(0.2)

1.2 线程共享同一个进程的变量

import threading
num = 1
def fun1():
    num = 2
    print(num)
fun1()
print(num)
def fun2():
    global num
    num = 3
    print(num)
fun2()
print(num)
def fun3():
    global num
    num = 4
    print(num)
t = threading.Thread(target=fun3)
t.start()
print(num)

1.3 互斥锁

由于线程共享一个进程中的数据,所以在多个线程同时修改某一个共享数据时,会造成数据混乱,基于此,引入互斥锁,来保证

数据的正确性。

import threading
import time
num = 0
def fun1():
    global num
    for r in range(1000000):
        # 加锁,mutex.acquire()默认blocking为True,表示当前线程去获取加锁资源时如果加锁不成功则阻塞直到加锁成功
        mutex.acquire()
        num += 1
        mutex.release()
def fun2():
    global num
    for r in range(1000000):
        mutex.acquire()
        num += 1
        mutex.release()

mutex = threading.Lock()
t1 = threading.Thread(target=fun1)
t1.start()
# time.sleep(2)
t2 = threading.Thread(target=fun1)
t2.start()
time.sleep(2)
print(num)

锁的好处:确保数据正确性,避免数据混乱

锁的坏处:阻止多线程并发执行,现率降低

                  可能会造成死锁

思索可以控制线程的执行顺序

import threading
mutex1 = threading.Lock()
mutex2 = threading.Lock()
mutex2.acquire()
mutex3 = threading.Lock()
mutex3.acquire()
mutex4 = threading.Lock()
mutex4.acquire()
def fun1():
    while True:
        if mutex1.acquire():
            print("fun1 do")
            mutex2.release()
def fun2():
    while True:
        if mutex2.acquire():
            print("fun2 do")
            mutex3.release()
def fun3():
    while True:
        if mutex3.acquire():
            print("fun3 do")
            mutex4.release()
t1 = threading.Thread(target=fun1)
t2 = threading.Thread(target=fun2)
t3 = threading.Thread(target=fun3)
t1.start()
t2.start()
t3.start()
if mutex4.acquire():
    print("finish")

1.4 ThreadLocal

通过ThreadLocal声明的变量,只能被变量所属的线程自己访问,实现了线程之间的数据隔离

import threading
import time
local_var = threading.local()
# print(local_var, type(local_var))
def fun1():
    local_var.stdo1 = 60
    print(local_var.stdo1)
def fun2():
    local_var.stdo1 = 100
    print(local_var.stdo1)
t1 = threading.Thread(target=fun1)
t2 = threading.Thread(target=fun2)
t2.start()
time.sleep(1)
t1.start()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值