【python3 多线程 2/3】线程同步

本文深入探讨了Python中线程同步的重要性,通过对比线程异步与同步的代码实现,详细解析了线程锁(threadLock)在确保线程安全方面的应用。从线程创建、执行到释放的全过程,展示了如何避免竞态条件,确保数据的一致性和程序的稳定性。

阅读本文之前请阅读:Python真正多线程之殇——GIL全局解释锁 https://blog.youkuaiyun.com/weixin_41827162/article/details/84563235 

-

1. 认识线程同步现象:

https://blog.youkuaiyun.com/weixin_41827162/article/details/84104421线程异步中,

将方法1中:

建多个线程,同时执行多个线程,由新到旧逐个释放线程

改成:

创建一个线程,执行一个线程,释放一个线程

-

#!/usr/bin/python3
# 线程异步
 
import threading
import time
 
exitFlag = 0
 
 
class myThread(threading.Thread):
    def __init__(self, thread_id, name, counter):
        threading.Thread.__init__(self)
        self.thread_id = thread_id
        self.name = name
        self.counter = counter
        pass
 
    def run(self):
        print("开始线程=" + self.name)
        run_def(self.name, self.counter, 5)
        print("退出线程=" + self.name)
        pass
    pass
 
 
def run_def(thread_name, delay, counter):
    while counter:
        if exitFlag:
            thread_name.exit()
            pass
        time.sleep(delay)
        # time.sleep(0)
        list(thread_name)
        counter -= 1
        pass
    pass
 
 
def list(thread_name):
    print("\n执行线程=" + thread_name)
    pass
 
 
threads = []  # 存储在线线程
 
# 创建线程
for this_t in range(1, 10):
    t = myThread(this_t, "Thread-" + str(this_t), 0.1)
    t.start()
    t.join()  # 线程同步,线程异步
    threads.append(t)
    pass
 
# 终止线程
# for t in threads:
#     t.join()
#     pass
 
print("程序完成!!")

-

2. 真正的线程同步:

#!/usr/bin/python3

# 线程同步

import threading
import time


class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter

    def run(self):
        print("开启线程: " + self.name)
        # 获取锁,用于线程同步
        threadLock.acquire()
        print_time(self.name, self.counter, 3)
        # 释放锁,开启下一个线程
        threadLock.release()


def print_time(threadName, delay, counter):
    while counter:
        time.sleep(0)
        print("%s: %s" % (threadName, time.ctime(time.time())))
        counter -= 1


threadLock = threading.Lock()
threads = []


for cal in range(1, 100):
    that = myThread(cal, "Thread-" + str(cal), cal).start()
    print("创建了线程=" + str(cal))
    threads.append(that)
    pass

print("退出主线程")

-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值