python3已经不支持thread库,用_thread代替,但是还是推荐使用threading。
1.线程的简单使用
2.线程的使用(线程同步)import threading import time exitFlag = False class myThread(threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): #把要执行的代码写到run函数中,线程在创建后会直接运行run函数 print("Starting " + self.name) print_time(self.name, self.counter, 5) print("Exiting " + self.name) def print_time(threadName, delay, counter): while counter: if exitFlag: thread.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() print("Exiting Main Thread")
使用threading对象de的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire()和release(),对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire()和release()之间。如下:import threading import time exitFlag = False class myThread(threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): #把要执行的代码写到run函数中,线程在创建后会直接运行run函数 print("Starting " + self.name) #获得锁,成功获得锁定后返回True #可选的timeout参数,不填的时候将一直阻塞到获得锁定 #否则超时后将返回True threadLock.acquire() print_time(self.name, self.counter, 5) #释放锁 threadLock.release() print("Exiting " + self.name) def print_time(threadName, delay, counter): while counter: if exitFlag: thread.exit() 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("Exiting Main Thread")
3.线程优先级队列(Queue) Python的Queue模块中提供了同步的、线程安全的队列类,包括FiFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。 Queue模块中的常用方法:
- Queue.get_nowait()相当Queue.get(False)
- Queue.qsize()返回队列的大小
- Queue.empty()如果队列为空,返回True,反之False
- Queue.full()如果队列满了,返回True,返回False
- Queue.full与maxsize大小对应
- Queue.get([block[, timeout]])获取队列,timeout等待时间
- Queue.put(item)写入队列,timeout等待时间
- Queue.put_nowait(item)相当Queue.put(item,False)
- Queue.task_done()在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
- Queue.join()实际上意味着等到队列为空,再执行别的操作
import queue import threading import time exitFlag = False class myThread(threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name, q): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.q = q def run(self): print("Starting " + self.name) process_data(self.name, self.q) print("Exiting " + self.name) def process_data(threadName, q): while not exitFlag: queueLock.acquire() if not workQueue.empty(): data = q.get() queueLock.release() print("%s processing %s" % (threadName, data)) else: queueLock.release() time.sleep(1) threadList = ["Thread-1", "Thread-2", "Thread-3"] nameList = ["One", "Two", "Three", "Four", "Five"] queueLock = threading.Lock() workQueue = queue.Queue(10) threads = [] threadID = 1 #创建新线程 for tName in threadList: thread = myThread(threadID, tName, workQueue) thread.start() threads.append(thread) threadID += 1 #填充队列 queueLock.acquire() for word in nameList: workQueue.put(word) queueLock.release() #等待队列清空 while not workQueue.empty(): pass #通知线程是时候退出 exitFlag = True #等待所有线程完成: for t in threads: t.join() print("Exiting Main Thread")
python线程的使用
最新推荐文章于 2024-07-11 17:34:26 发布