Python3 中线程常用的两个模块为:
thread 模块已经废弃,在 Python3 中使用 threading 模块代替。(因为兼容性,Python3 将 thread 重命名为 _thread )
使用线程的两种方式:
调用 _thread 模块中的 start_new_thread() 函数来产生新线程。
_thread.start_new_thread(function, args[, kwargs])
参数说明:
#! /usr/bin/env python3 # 用来指定本脚本用什么解释器来执行 import _thread import time # 为线程定义一个函数 def print_time(threadName, delay): count = 0 while count < 5: time.sleep(delay) count += 1 print("%s: %s" %(threadName, time.ctime(time.time()) ) ) # 创建两个线程 try: _thread.start_new_thread(print_time, ("Thread-1", 2, ) ) _thread.start_new_thread(print_time, ("Thread-2", 4, ) ) except: print("Error: 无法启动线程") while 1: pass
threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法:
提供了 Thread 类来处理线程,Thread 类提供了以下方法:
从 threading.Thread 继承创建一个新的子类,实例化后调用 start() 方法启动新线程,调用线程的run()方法。
import threading import time exitFlag = 0 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) print_time(self.name, self.counter, 5) print("退出线程: " + self.name) def print_time(threadName, delay, counter): while counter: if exitFlag: threadName.exit() time.sleep(delay) print("%s: %s" %(threadName, time.ctime(time.time()))) counter -= 1 # 创建新线程 thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # 开启新线程 thread1.start() thread2.start() thread1.join() thread2.join() print("退出主线程")
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放在 acquire 和 release 方法之间。
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(delay) print("%s: %s" % (threadName, time.ctime(time.time()))) counter -= 1 threadLock = threading.Lock() threads = [] # 创建新线程 thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # 开启新线程 thread1.start() thread2.start() # 添加线程到线程列表 threads.append(thread1) threads.append(thread2) # 等待所有线程完成 for t in threads: t.join() print("退出主线程")
参考:https://www.runoob.com/python3/python3-multithreading.html