Python学习超简单第十弹:多线程
Python快乐学习、快乐成长1、多线程2、Python 多线程2.1 _thread 模块实现2.2 threading 模块实现3、线程同步4、线程优先级队列5、多线程使用场景结尾1、多线程进程软件独立运行的「独立大房子」资源独立比如微信、浏览器、Python 程序 各是一个进程线程进程里面的「小工人」共享同一个进程资源内存、变量、文件、连接一个进程至少有 1 个主线程在主线程之外额外开多个子线程同时干活 多线程。多线程在同一个进程内创建多个线程交替并发执行多个任务宏观看起来「同时运行」微观是快速切换轮流执行。2、Python 多线程Python3 线程中常用的两个模块为_threadthreading(推荐使用)thread 模块已被废弃。用户可以使用 threading 模块代替。所以在 Python3 中不能再使用thread 模块。为了兼容性Python3 将 thread 重命名为 “_thread”。2.1 _thread 模块实现函数式调用 _thread 模块中的 start_new_thread() 函数来产生新线程。语法如下:_thread.start_new_thread ( function, args[, kwargs] )新建threadTest.pyimport_threadimporttime#定义一个函数defprint_time(threadName,delay):count0whilecount3:time.sleep(delay)count1print(threadName,:,time.strftime(%Y-%m-%d %H:%M:%S,time.localtime(time.time())))#创建2个线程try:_thread.start_new_thread(print_time,(Thread-1,1))_thread.start_new_thread(print_time,(Thread-2,2))except:print(Error,启动线程失败)whileTrue:pass打印结果Thread-1 : 2026-04-24 08:44:33Thread-2 : 2026-04-24 08:44:34Thread-1 : 2026-04-24 08:44:34Thread-1 : 2026-04-24 08:44:35Thread-2 : 2026-04-24 08:44:36Thread-2 : 2026-04-24 08:44:382.2 threading 模块实现_thread提供了低级别的、原始的线程以及一个简单的锁它相比于 threading 模块的功能还是比较有限的。threading 模块除了包含 _thread 模块中的所有方法外还提供的其他方法threading.currentThread(): 返回当前的线程变量。threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前不包括启动前和终止后的线程。threading.activeCount(): 返回正在运行的线程数量与 len(threading.enumerate()) 有相同的结果。除了使用方法外线程模块同样提供了 Thread 类来处理线程Thread 类提供了以下方法:run(): 用以表示线程活动的方法。start():启动线程活动。join([time]): 等待至线程中止。这阻塞调用线程直至线程的 join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。isAlive(): 返回线程是否活动的。getName(): 返回线程名。setName(): 设置线程名。新建threadingTest.pyimportthreadingimporttime exitFlag0classmyThread(threading.Thread):def__init__(self,threadId,name,counter):threading.Thread.__init__(self)self.threadIDthreadId self.namename self.countercounterdefrun(self):print(run:self.name)print_time(self.name,self.counter,5)print(exit:self.name)defprint_time(name,delay,counter):whilecounter:ifexitFlag:name.exit()time.sleep(delay)print(threadName:name:time.strftime(%Y-%m-%d %H:%M:%S,time.localtime(time.time())))counter-1# 创建线程myThread1myThread(1,myThread-1,3)myThread2myThread(2,myThread-2,4)# 开启myThread1.start()myThread2.start()myThread1.join()myThread2.join()print(退出主线程)打印结果run:myThread-1run:myThread-2threadName:myThread-1:2026-04-24 08:48:22threadName:myThread-2:2026-04-24 08:48:23threadName:myThread-1:2026-04-24 08:48:25threadName:myThread-2:2026-04-24 08:48:27threadName:myThread-1:2026-04-24 08:48:28threadName:myThread-2:2026-04-24 08:48:31threadName:myThread-1:2026-04-24 08:48:31threadName:myThread-1:2026-04-24 08:48:34exit:myThread-1threadName:myThread-2:2026-04-24 08:48:35threadName:myThread-2:2026-04-24 08:48:39exit:myThread-2退出主线程3、线程同步什么是线程同步一句话多个线程一起干活时防止它们同时修改同一个数据导致数据错乱。它为什么需要多线程共享同一个进程的变量 / 资源。如果两个线程同时修改一个数字就会出现数据算错脏数据程序异常这就叫线程不安全。线程同步 排队执行同一时间只让一个线程修改共享数据。Python中使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步这两个对象都有 acquire 方法和 release 方法对于那些需要每次只允许一个线程操作的数据可以将其操作放到 acquire 和 release 方法之间。实例如下新建 threadingSyncTest.py 文件importthreadingimporttimeclassmyThread(threading.Thread):def__init__(self,threadId,name,counter):threading.Thread.__init__(self)self.threadIDthreadId self.namename self.countercounterdefrun(self):print(run:self.name)# 获取锁threadLock.acquire()print_time(self.name,self.counter,5)# 释放锁threadLock.release()defprint_time(name,delay,counter):whilecounter:time.sleep(delay)print(threadName:name:time.strftime(%Y-%m-%d %H:%M:%S,time.localtime(time.time())))counter-1threadLockthreading.Lock()threads[]# 创建线程myThread1myThread(1,myThread-1,1)myThread2myThread(2,myThread-2,2)# 开启新线程myThread1.start()myThread2.start()#添加线程到列表threads.append(myThread1)threads.append(myThread2)# 开启fortinthreads:t.join()print(退出主线程)打印结果run:myThread-1run:myThread-2threadName:myThread-1:2026-04-24 08:52:06threadName:myThread-1:2026-04-24 08:52:07threadName:myThread-1:2026-04-24 08:52:08threadName:myThread-1:2026-04-24 08:52:09threadName:myThread-1:2026-04-24 08:52:10threadName:myThread-2:2026-04-24 08:52:12threadName:myThread-2:2026-04-24 08:52:14threadName:myThread-2:2026-04-24 08:52:16threadName:myThread-2:2026-04-24 08:52:18threadName:myThread-2:2026-04-24 08:52:20退出主线程4、线程优先级队列什么是优先级队列普通队列先进先出 FIFO优先级队列谁优先级高谁先出Python 的 Queue 模块中提供了同步的、线程安全的队列类包括 FIFO先入先出)队列 QueueLIFO后入先出队列 LifoQueue和优先级队列 PriorityQueue。这些队列都实现了锁原语能够在多线程中直接使用可以使用队列来实现线程间的同步。Queue 模块中的常用方法:Queue.qsize() 返回队列的大小Queue.empty() 如果队列为空返回 True,反之 FalseQueue.full() 如果队列满了返回 True,反之 FalseQueue.full 与 maxsize 大小对应Queue.get([block[, timeout]]) 获取队列timeout 等待时间Queue.get_nowait() 相当 Queue.get(False)Queue.put(item) 写入队列timeout 等待时间Queue.put_nowait(item) 相当 Queue.put(item, False)Queue.task_done() 在完成一项工作之后Queue.task_done() 函数向任务已经完成的队列发送一个信号Queue.join() 实际上意味着等到队列为空再执行别的操作新建threadingQueueTest.pyimportqueueimportthreadingimporttime exitFlag0threadLockthreading.Lock()queuequeue.Queue()queueLockthreading.Lock()threadList[myThread-1,myThread-2,myThread-3]nameList[one,two,three]threadID1threads[]classmyThread(threading.Thread):def__init__(self,threadId,name,q):threading.Thread.__init__(self)self.threadIDthreadId self.namename self.qqdefrun(self):print(run:self.name)print_data(self.name,self.q)print(exit:self.name)defprint_data(name,q):whilenotexitFlag:queueLock.acquire()ifnotqueue.empty():dataq.get()queueLock.release()print(%s process-- %s%(name,data))else:queueLock.release()time.sleep(1)# 创建线程fortinthreadList:threadmyThread(threadID,t,queue)thread.start()threads.append(thread)threadID1# 队列填充queueLock.acquire()forninnameList:queue.put(n)queueLock.release()# 等待队列清空whilenotqueue.empty():pass# 通知线程退出exitFlag1# 等待所有线程完成fortinthreads:t.join()print(退出主线程)打印结果run:myThread-1run:myThread-2run:myThread-3myThread-3 process-- onemyThread-2 process-- twomyThread-1 process-- threeexit:myThread-3exit:myThread-2exit:myThread-1退出主线程5、多线程使用场景接口请求数据库操作文件读写爬虫批量上传 / 下载结尾记录自己的快乐学习日志也祝贺观看到这的小伙伴早日学有所成财富自由。记得点赞、收藏呀