Chinaunix首页 | 论坛 | 博客
  • 博客访问: 319616
  • 博文数量: 240
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-04 18:14
文章分类

全部博文(240)

文章存档

2017年(8)

2014年(4)

2013年(15)

2012年(4)

2011年(14)

2010年(55)

2009年(140)

我的朋友

分类: Python/Ruby

2010-03-26 23:17:45

首先使用两个例子来观察单线程和多线程:
 

#!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) |
给主人留下些什么吧!~~