您的位置:首页 > 编程语言 > Python开发

python 多线程学习一

2013-12-08 22:21 357 查看
python线程使用有两种方法:

1.直接调用threading.Thread来构造thread对象,Thread的参数如下:

    class threading.Thread(group=None target=None name=None args=() kwargs={}) 

          group为None;

          target为线程将要执行的功能函数;

          name为线程的名字,也可以在对象构造后调用setName()来设定;

          args为tuple类型的参数,可以为多个,如果只有一个也的使用tuple的形式传入,例如(1);

          kwargs为dict类型的参数,也即位命名参数;
2.实现自己的threading.Thread的子类,需要重载__init__()和run()。

下面是两个例子:

import time
import threading

def timer(no,interval):
cnt =0
print threading.Thread.getName()
while cnt<10:
print "Thread %d,time:%s" %(no,time.ctime())
time.sleep(interval)
cnt+=1

def test():
a = threading.Thread(name ="ping",target=timer,args=(1,1))
b = threading.Thread(name ="mao",target=timer,args=(2,2))

a.start()
b.start()

a.join()
b.join()
if __name__ =='__main__':
test()


 

import threading
import time
import datetime

class timer(threading.Thread):
def __init__(self,no,interval):
self.m_no =no
self.m_interval = interval
threading.Thread.__init__(self)

def run(self):
cnt =0
while cnt<10:
print "no %d,cnt is %d,time is %s" %(self.m_no,cnt,datetime.datetime.now())
time.sleep(self.m_interval)
cnt+=1

def test():
a =timer(1,1)
a.start()
if __name__=='__main__':
test()
print "Main thread exit"


 

python对于thread的管理中有两个函数:join和setDaemon

join:如在一个线程B中调用threada.join(),则threada结束后,线程B才会接着threada.join()往后运行。

使得一个线程可以等待另一个线程执行结束后再继续运行。这个方法还可以设定一个timeout参数,避免无休止的等待。因为两个线程顺序完成,看起来象一个线程,所以称为线程的合并。

setDaemon:主线程A启动了子线程B,调用b.setDaemon(True),则主线程结束时,会把子线程B也杀死。

python中得thread的一些机制和C/C++不同:在C/C++中,主线程结束后,其子线程会默认被主线程kill掉。而在python中,主线程结束后,会默认等待子线程结束后,主线程才退出。通过调用setDaemon(True),能与C/C++中得默认效果是一样的。

import threading
import time
import datetime

lock=threading.Lock()

class timer(threading.Thread):
def __init__(self,no,interval):
self.m_no =no
self.m_interval =interval
threading.Thread.__init__(self)

def run(self):
cnt =0
while cnt<10:
lock.acquire()
print "no %d,cnt is %d,time is %s" %(self.m_no,cnt,datetime.datetime.now())
lock.release()
time.sleep(self.m_interval)
cnt+=1

def test():
a =timer(1,1)
b =timer(2,2)
#b.setDaemon(True)
a.start()
b.start()
if __name__=='__main__':
test()
print "Main thread exit"


上面的程序启动了两个线程,输出结果如下:



如果将#b.setDaemon(True)的注释去掉,则输出结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 线程