我> 上一页下一页
运行多个线程类似于同时运行多个不同的程序,但具有以下好处 -
-
一个进程内的多个线程与主线程共享相同的数据空间,因此与单独的进程相比,它们可以更容易地共享信息或相互通信。
-
线程有时称为轻量级进程,它们不需要太多内存开销;它们比流程便宜。
一个线程有一个开始、一个执行顺序和一个结论。它有一个指令指针,用于跟踪当前在其上下文中的运行位置。
-
可以抢占(打断)
-
它可以在其他线程运行时暂时搁置(也称为休眠) - 这称为让步。
开始一个新线程
要生成另一个线程,您需要调用 thread 中可用的以下方法 模块 -
thread.start_new_thread ( function, args[, kwargs] )
此方法调用提供了一种在 Linux 和 Windows 中创建新线程的快速有效的方法。
方法调用立即返回,子线程启动并使用传递的 args 列表调用函数 .当函数返回时,线程终止。
在这里,参数 是一个参数元组;使用空元组调用函数而不传递任何参数。 kwargs 是一个可选的关键字参数字典。
示例
#!/usr/bin/pythonimport threadimport time# 为threaddef定义一个函数 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:打印“错误:无法启动线程”while 1:通过
执行上述代码时,会产生以下结果 -
Thread-1:2009 年 1 月 22 日星期四 15:42:17 2009Thread-1:2009 年 1 月 22 日星期四 15:42:19 2009Thread-2:2009 年 1 月 22 日星期四 15:42:19 2009Thread-1:星期四Jan 22 15:42:21 2009Thread-2:Thu Jan 22 15:42:23 2009Thread-1:Thu Jan 22 15:42:23 2009Thread-1:Thu Jan 22 15:42:25 2009Thread-2:Thu Jan 15:42:27 2009Thread-2:2009 年 1 月 22 日星期四 15:42:31 2009Thread-2:2009 年 1 月 22 日星期四 15:42:35
虽然对于低级线程非常有效,但是线程 与较新的线程模块相比,模块非常有限。
线程 模块
Python 2.4 中包含的较新线程模块为线程提供了比上一节中讨论的线程模块更强大、更高级的支持。
线程 模块暴露了线程的所有方法 模块并提供一些额外的方法 -
-
threading.activeCount() − 返回活动线程对象的数量。
-
threading.currentThread() − 返回调用者线程控制中的线程对象数。
-
threading.enumerate() − 返回当前活动的所有线程对象的列表。
除了方法之外,线程模块还有 Thread 实现线程的类。 Thread 提供的方法 类如下 -
-
运行() − run() 方法是线程的入口点。
-
开始() − start() 方法通过调用run 方法启动一个线程。
-
加入([时间]) − join() 等待线程终止。
-
isAlive() − isAlive() 方法检查线程是否仍在执行。
-
getName() − getName() 方法返回线程的名称。
-
setName() − setName() 方法设置线程的名称。
使用线程创建线程 模块
要使用线程模块实现新线程,您必须执行以下操作 -
-
定义 Thread 的新子类 课。
-
覆盖 __init__(self [,args]) 添加额外参数的方法。
-
然后,重写 run(self [,args]) 方法来实现线程在启动时应该做什么。
一旦你创建了新的线程 子类,您可以创建它的一个实例,然后通过调用 start() 启动一个新线程 ,它依次调用 run() 方法。
示例
#!/usr/bin/pythonimport threadingimport timeexitFlag =0class 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 "Starting " + self.name print_time(self.name, 5, self.counter) print "Exiting " + self.namedef print_time(threadName) , counter, delay):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)# Start new Threadsthread1.start()thread2.start()print "Exiting Main Thread"
执行上述代码时,会产生以下结果 -
Starting Thread-1Starting Thread-2Exiting Main ThreadThread-1:Thu Mar 21 09:10:03 2013Thread-1:Thu Mar 21 09:10:04 2013Thread-2:Thu Mar 21 09: 10:04 2013Thread-1: 2013 年 3 月 21 日星期四 09:10:05 2013 年 3 月 21 日星期四 09:10:06 2013Thread-2: 2013 年 3 月 21 日星期四 09:10:06 2013 年 3 月 21 日星期四:09:11 07 2013Exiting Thread-1Thread-2:Thu Mar 21 09:10:08 2013Thread-2:Thu Mar 21 09:10:10 2013Thread-2:Thu Mar 21 09:10:12 2013Exiting Thread-2
同步线程
Python 提供的线程模块包括一个易于实现的锁定机制,允许您同步线程。通过调用 Lock() 创建一个新锁 方法,返回新锁。
获取(阻塞) 新锁对象的方法用于强制线程同步运行。可选的阻塞 参数使您可以控制线程是否等待获取锁。
如果阻塞 设置为 0,如果无法获取锁,线程立即返回 0 值,如果获取了锁,则返回 1。如果阻塞设置为 1,则线程阻塞并等待锁被释放。
release() 新锁对象的方法用于在不再需要时释放锁。
示例
#!/usr/bin/pythonimport threadingimport timeclass 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 "Starting " + self.name # 获取锁同步线程 threadLock.acquire() print_time(self.name, self.counter, 3) # Free锁定释放下一个线程 threadLock.release()def print_time(threadName, delay, counter):while counter:time.sleep(delay) print "%s:%s" % (threadName, time.ctime(time.time() )) counter -=1threadLock =threading.Lock()threads =[]#创建新线程thread1 =myThread(1, "Thread-1", 1)thread2 =myThread(2, "Thread-2", 2)#开始新线程Threadsthread1.start()thread2.start()#添加线程到线程列表threads.append(thread1)threads.append(thread2)#等待所有线程完成for t in thread:t.join()print "Exiting Main Thread"预>执行上述代码时,会产生以下结果 -
启动线程1启动线程2线程1:2013年3月21日星期四09:11:28 2013年线程1:2013年3月21日星期四09:11:29 2013Thread-1:3月21日星期四09:11: 30 2013Thread-2:Thu Mar 21 09:11:32 2013Thread-2:Thu Mar 21 09:11:34 2013Thread-2:Thu Mar 21 09:11:36 2013Exiting Main Thread多线程优先队列
队列 模块允许您创建一个新的队列对象,该对象可以容纳特定数量的项目。有以下控制队列的方法 -
-
获取() − get() 从队列中移除并返回一个项目。
-
放置() − put 将项目添加到队列中。
-
qsize() − qsize() 返回当前队列中的项目数。
-
空() − 如果队列为空,empty( ) 返回 True;否则为 False。
-
完整() - 如果队列已满,full() 返回 True;否则为 False。
示例
#!/usr/bin/pythonimport Queueimport threadingimport timeexitFlag =0class myThread (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.namedef process_data(threadName, q):而不是 exitFlag:queueLock.acquire() 如果不是 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 =["一", "二", "三", "四", "五"]queueLock =threading.Lock()workQueue =Queue.Queue(10)threads =[]threadID =1#为threadList中的tName创建新线程:thread =myThread(threadID, tName, workQueue) thread.start()threads。 append(thread) threadID +=1# 为nameList中的word填入queuequeueLock.acquire():workQueue.put(word)queueLock.releas e()# 等待队列为空而不工作Queue.empty():pass# 通知线程该退出exitFlag =1# 等待所有线程完成for t in thread:t.join()print "Exiting Main Thread"预>执行上述代码时,会产生以下结果 -
Starting Thread-1Starting Thread-2Starting Thread-3Thread-1 处理 OneThread-2 处理 TwoThread-3 处理 ThreeThread-1 处理 FourThread-2 处理 FiveExiting Thread-3Exiting Thread-1Exiting Thread-2Exiting Main Thread
Python