zoukankan      html  css  js  c++  java
  • Python多线程的创建,相关函数和守护线程的理解

    一:多线程的创建

        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=Nonetarget=Nonename=Noneargs=()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 ')

    •         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有效。

  • 相关阅读:
    GO语言的进阶之路-Golang字符串处理以及文件操作
    将本地的代码推送到公网的github账号去
    GO语言的进阶之路-go的程序结构以及包简介
    Linux操作系统原理
    Linux安装-kickstart无人值守安装
    LVM逻辑卷管理
    Liunx软Raid实现
    parted分区工具用法
    高级Linux运维工程师必备技能(扫盲篇)
    H3C配置FTP服务器
  • 原文地址:https://www.cnblogs.com/chuanheng/p/python_daemon_thread.html
Copyright © 2011-2022 走看看