首先使用两个例子来观察单线程和多线程:
#!C:\\python26\\python.exe # -*- coding:UTF-8 -*-
# Name: danxiancheng.py
import time import threading
def loop(num,sec): print 'loop %s start: ....' % num, time.strftime('%Y-%M-%d %H:%m:%S') time.sleep(sec) print 'loop %s stop: .....' % num, time.strftime('%Y-%M-%d %H:%m:%S')
def main(): print '\nStarting: ........', time.strftime('%Y-%M-%d %H:%m:%S'), '\n' mysec = [3,5,6,8] for i in range(len(mysec)): loop(i,mysec[i]) print '\nAll DONE: ........', time.strftime('%Y-%M-%d %H:%m:%S'), '\n'
if __name__=='__main__': main()
# 运行结果:
===========================================================
D:\>python danxiancheng.py
Starting: ........ 2010-09-26 23:03:01
loop 0 start: .... 2010-09-26 23:03:01 loop 0 stop: ..... 2010-09-26 23:03:04 loop 1 start: .... 2010-09-26 23:03:04 loop 1 stop: ..... 2010-09-26 23:03:09 loop 2 start: .... 2010-09-26 23:03:09 loop 2 stop: ..... 2010-09-26 23:03:15 loop 3 start: .... 2010-09-26 23:03:15 loop 3 stop: ..... 2010-09-26 23:03:23
All DONE: ........ 2010-09-26 23:03:23
===========================================================
|
#!C:\\python26\\python.exe # -*- coding:UTF-8 -*-
# Name: duoxiancheng.py
import time import threading
def loop(num,sec): print 'loop %s start: ....' % num, time.strftime('%Y-%M-%d %H:%m:%S') time.sleep(sec) print 'loop %s stop: .....' % num, time.strftime('%Y-%M-%d %H:%m:%S')
def main(): print '\nStarting: ........', time.strftime('%Y-%M-%d %H:%m:%S'), '\n' mysec = [3,5,6,8] mythreads = [threading.Thread(target=loop,args=(i,mysec[i])) for i in range(len(mysec))]
for i in mythreads: i.start() for i in mythreads: i.join() print '\nAll DONE: ........', time.strftime('%Y-%M-%d %H:%m:%S'), '\n'
if __name__=='__main__': main()
# 运行结果:
===========================================================
D:\>python duoxiancheng.py Starting: ........ 2010-11-26 23:03:17
loop 0 start: .... 2010-11-26 23:03:17 loop 1 start: .... 2010-11-26 23:03:17 loop 2 start: .... 2010-11-26 23:03:17 loop 3 start: .... 2010-11-26 23:03:17 loop 0 stop: ..... 2010-11-26 23:03:20 loop 1 stop: ..... 2010-11-26 23:03:22 loop 2 stop: ..... 2010-11-26 23:03:23 loop 3 stop: ..... 2010-11-26 23:03:25
All DONE: ........ 2010-11-26 23:03:25
===========================================================
|
可以看到单线程中的两个循环, 只有一个循环结束后另一个才开始。而多线程则是进程内所有线程一起执行,同步任务。
首先创建了n个线程,并将其存放到mythreads列表中,这里用到的是给Thread类传递了函数,第一个for循环是让两个线程开始执行。第二个for循环再让每个线程分别调用join函数,使程序挂起,直至相应线程都执行结束。
附:threading模块
首先看一下threading模块中的对象: Thread:表示一个线程的执行的对象 Lock:锁原语对象 RLock:可重入锁对象。使单线程可以再次获得已经获得的锁 Condition:条件变量对象能让一个线程停下来,等待其他线程满足了某个“条件”,如状态的改变或值的改变 Event:通用的条件变量。多个线程可以等待某个事件发生,在事件发生后,所有的线程都被激活 Semaphore:为等待锁的线程提供一个类似“等候室”的结构 BoundedSemaphore :与semaphore类似,只是它不允许超过初始值 Timer:与Thread类似,只是,它要等待一段时间后才开始运行
其中Thread类是主要的运行对象,它有很多函数,常用的为以下三种。 创建一个Thread的实例,传给它一个函数 创建一个Thread实例,传给它一个可调用的类对象 从Thread派生出一个子类,创建一个这个子类的实例
Thread类的函数有: | getName(self) 返回线程的名字 | isAlive(self) 布尔标志,表示这个线程是否还在运行中 | isDaemon(self) 返回线程的daemon标志 | join(self, timeout=None) 程序挂起,直到线程结束,如果给出timeout,则最多阻塞timeout秒 | run(self) 定义线程的功能函数 | setDaemon(self, daemonic) 把线程的daemon标志设为daemonic | setName(self, name) 设置线程的名字 | start(self) 开始线程执行
|
#!C:\\python26\\python.exe # -*- coding:UTF-8 -*- import threading import time,datetime # 对于大多数情况来说,从 threading.Thread 进行继承是一种最佳实践,因为它创建了用于线程编程的常规 API。 class ThreadClass(threading.Thread): def run(self): now = datetime.datetime.now() print "%s says Hello World at time: %s" % (self.getName(), now) time.sleep(8)
for i in range(10): t = ThreadClass() t.start()
|
阅读(1874) | 评论(0) | 转发(0) |