Python 线程同步

本文介绍Python中使用Thread对象的Lock和RLock实现线程同步。通过acquire和release方法控制对共享数据的访问,避免数据不同步问题。包含两个代码示例:示例一演示自定义线程类使用Lock同步print_time函数;示例二类似,展示线程ID和计数器同步输出。

作者:zhuge···预计阅读 12 分钟·618 阅读·0 评论
Python 线程同步

使用Thread对象的Lock和RLock可以实现简单的线程同步,这两个对象都有acquire方法和release方法。对于每次只允许一个线程操作的数据,可以将操作放到acquire和release方法之间。多线程的优势在于可以同时运行多个任务,但当线程需要共享数据时,可能存在数据不同步的问题。

示例一

import threading
from time import sleep
from datetime import datetime

class MyThread(threading.Thread): def init(self, func, args, name=''): threading.Thread.init(self) self.name = name self.func = func self.args = args def getResult(self): return self.res

def run(self):
    #调用类内的方法
    print('*********MyThread Run Start**********')
    print('param:---->' + self.name)
    #完成之后可以调用传入的方法
    threadLock.acquire()
    print_time(self.name,2,3)
    threadLock.release()
    self.res = self.func(*self.args)
    print('*********MyThread Run End**********')

def print_time(threadName, delay, counter): while counter: sleep(delay) print(f'{threadName}:{get_date_str(datetime.now())}') counter -= 1

def get_date_str(dt): return datetime.strftime(dt, '%Y-%m-%d %H-%M-%S') def subthread(thid, sec): print(f'subthread-线程{thid},Start at {get_date_str(datetime.now())} ,sleep{sec} s') sleep(sec) print(f'subthread-线程{thid},End at {get_date_str(datetime.now())} ,sleep{sec} s') def main(): print('-' * 10 + 'ALL START:' + get_date_str(datetime.now()) + '-' * 10) threads.append(MyThread(subthread, (1, 2), subthread.name + '线程一')) threads.append(MyThread(subthread, (2, 3), subthread.name+ '线程二')) for i in range(len(threads)): threads[i].start() for i in threads: i.join() # 线程全部结束之后主线程才会退出 print('-' * 10 + 'ALL End:' + get_date_str(datetime.now()) + '-' * 10)

if name == 'main': threadLock = threading.Lock() threads = [] main()


示例二

import threading
from time import sleep
from datetime import datetime

class MyThread(threading.Thread): def init(self, threadID, name, counter): threading.Thread.init(self) self.name = name self.threadID = threadID self.counter = counter

def run(self):
    # 调用类内的方法
    print('*********MyThread Start**********')
    print('param:---->' + self.name)
    # 完成之后可以调用传入的方法
    threadLock.acquire()
    print_time(self.name,self.counter,3)
    threadLock.release()
    print('*********MyThread End**********')

def get_date_str(dt): return datetime.strftime(dt, '%Y-%m-%d %H-%M-%S')

def print_time(threadName, delay, counter): while counter: sleep(delay) print(f'{threadName}:{get_date_str(datetime.now())}') counter -= 1

def main(): print('-' * 10 + 'ALL START:' + get_date_str(datetime.now()) + '-' * 10)

threads.append(MyThread(1, 'thread-1', 1))
threads.append(MyThread(2, 'thread-2', 2))

for i in range(len(threads)):
    threads[i].start()
for i in threads:
    i.join()  # 线程全部结束之后主线程才会退出
print('-' * 10 + 'ALL End:' + get_date_str(datetime.now()) + '-' * 10)

if name == 'main': threadLock = threading.Lock() threads = [] main()

相关文章

评论

加载中...