使用Thread对象的Lock和RLock可以实现简单的线程同步,这两个对象都有acquire方法和release方法。对于每次只允许一个线程操作的数据,可以将操作放到acquire和release方法之间。多线程的优势在于可以同时运行多个任务,但当线程需要共享数据时,可能存在数据不同步的问题。
示例一
import threading from time import sleep from datetime import datetimeclass 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 datetimeclass 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()

评论