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

Python多线程的创建,相关函数和守护线程的理解

2013-05-07 19:30 701 查看
欢迎关注我的个人博客blog.timene.com

一:多线程的创建

threading库创建线程有两种方式,函数式和继承式

1)函数式

def func():

print 'Starting'

print 'Ending'

t=threading.Thread(name='func',target=func)

t.start()

2)继承式

class ThreadClass(threading.Thread):

def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):

threading.Thread.__init__(self, group, target, name, args, kwargs)

def run(self):

print 'Starting'

print 'Ending'

t = ThreadClass()

t.start()

Thread类的构造函数定义如下:

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

group:留作ThreadGroup扩展使用,一般赋值NULL

target:就是新建线程要执行的任务函数名

name:线程的名字,也可使用getName(),setName()获取或者修改

args:tuple参数

kwargs:dictionary参数

二:相关函数

1)start():启动线程;

2)join():主线程阻塞住,等待调用该函数的线程结束。join的参数是一个数字,如果非零就表示在此时间后,如果调用join的线程没有结束join函数也返回;

3)is_alive(), isAlive(),判断线程是否结束;

4)setDaemon(),设置函数为守护线程

class ThreadClass(threading.Thread):

def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):

threading.Thread.__init__(self, group, target, name, args, kwargs)

def run(self):

while True:

dosometing()......

t = ThreadClass()

t.setDaemon(True)

t.start()

while True:

if not t.is_alive():

print "t is dead"

exit(1)

time.sleep(60)

t.join()

三:守护线程

守护线程的概念有点不同于Linux环境下的概念,可能是我没理解,但是这个概念和Java里的守护线程一样:

守护线程在主线程退出后也会随着退出,非守护线程则不会。什么意思呢?

对于普通线程,如果线程的任务没有结束,主线程不会退出,整个程序也不会退出;

对于守护线程,即使线程任务还没有结束,如果主线程退出该线程也会退出;

(不知道这样的理解对不对,实验一下)

#--encoding='utf-8'--

import logging

import threading

import time

logging.basicConfig(

level=logging.DEBUG,

format='(%(threadName)-10s) %(message)s',

)

def ThreadFunc():

logging.debug(' Starting')

file_object = open('thefile.txt', 'w+')

while True:

file_object.write('wahaha\r\n')

file_object.flush()

time.sleep(1)

logging.debug(' Existing')

file_object.close( )

t=threading.Thread(name='ThreadFunc',target=ThreadFunc)

#t.setDaemon(True)

t.start()

time.sleep(5)

1)首先注释掉d.setDaemon(True),也就是d是一个普通线程

执行之后,主线程本该在5秒后退出,但是却发现该线程还是不断的输入wahaha,该脚本一直运行直到kill掉改脚本的执行。此时Ctrl+c也无效,只有kill。

2)删除d.setDaemon(True)前面的#,也就是d是一个守护线程

执行之后,主线程在5秒后退出,线程d只输出少于五个wahah之后也随着主线程的退出而退出,整个脚本退出。在退出前Ctrl+c有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐