文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>python 多线程事例

python 多线程事例

时间:2010-03-26  来源:zhaohang3031

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

#!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()


相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载