Python/网络编程/多线程与多进程03

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39591494/article/details/89196205

Thread类:


  Thread类是threading模块中最常用的功能,通过调用用户指定函数func,用于独立生成一个活动线程。调用用户指定函数func,可以有两种方法:一是在Thread创建实例对象时,把func以参数的形式传递给构造函数;二是通过继承Thread类重写run方法,调用func函数,在Thread的子类中,只允许__init__()run()方法进行重写。

Thread(group=None, target=None, name=None, args=(), kwargs=None, daemon=None)

  • group:用于保留,作为将来的扩展功能,可以忽略该参数,或设置group=none
  • target:设置线程需要执行的自定义函数,如target=func设置完成后被run()方法调用; 当target=none时,线程不执行任何操作。
  • name:指定需要执行的线程名称。不指定时,该类自动生成一个Thread-N形式的线程名称。
  • args:当自定义函数func带有参数时,把参数以元组的形式通过args传递给func
  • kwargs:当自定义函数的func带有参数时,把参数以字典的形式通过kwargs传递给func
  • daemon:当daemon不是none时,通过设置True&False确定是否守护进程。

Thread类的主要方法:

方法名称 使用描述
start() 线程启动状态(一个线程对象只能调用该方法一次),该方法必须在run()方法前被调用
run() 运行线程,使线程处于活动状态,在run()方法里执行指定的用户自定义函数func,该方法可以在Thread子类被重写
join(timeout=None) 阻塞调用线程。等待调用该方法的线程对象运行,一直到该线程执行终止,阻塞才释放。timeout为可选参数,可以设置阻塞时间(以秒为单位)当timeout参数不存在或者为none时,该操作将阻塞,直到线程终止。该方法运行在run()方法后
name 线程名称,初始名称由构造函数设置
is_alive() 返回线程是否存在
daemon 显示此线程是否为守护程序线程(True)或不(False)的布尔值。这必须在调用start() 之前设置,否则会引发runtimeError。

一旦一个线程对象被创建,其活动必须通过调用线程的start()方法来启动,然后调用run()方法执行指定的用户自定义函数func。join方法在run()方法后执行。这会阻塞调用线程,直到调用join方法的线程运行终止,才能执行后续的程序代码。

使用join方法:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import time
import threading
from threading import Thread


def countdown(n):
    while n > 0:
        print(f"线程名字为:{threading.current_thread().getName()},正在减数:", n)
        n -= 1
        time.sleep(1)


def main():
    """
    Thread(group=None, target=None, name=None, args=(), kwargs=None, daemon=None)
    A class that represents a thread of control.
    """
    # Thread(target=work_name).start()
    Thread_list = []
    logging.debug('start')
    for i in range(3):
        t = Thread(target=countdown, args=(3, )) # 启动3个线程运行countdown函数
        t.start()
        Thread_list.append(t)
    
    for i in Thread_list:
        i.join() # Wait until the thread terminates. # 终止

    logging.debug('stop')

if __name__ == "__main__":
    main()

>>>
线程名字为:Thread-1,正在减数: 3
线程名字为:Thread-2,正在减数: 3
线程名字为:Thread-3,正在减数: 3
线程名字为:Thread-3,正在减数: 2
线程名字为:Thread-1,正在减数: 2
线程名字为:Thread-2,正在减数: 2
线程名字为:Thread-3,正在减数: 1
线程名字为:Thread-1,正在减数: 1
线程名字为:Thread-2,正在减数: 1

加入log:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import time
import logging
import threading
from threading import Thread

logging.basicConfig(
    level=logging.DEBUG,
    format='%(threadName)-10s:%(message)s' # threadName:自动获取线程名字 message:输出信息
)


def countdown(n):
    while n > 0:
        # print(f"线程名字为:{threading.current_thread().getName()},正在减数:{n}")
        logging.debug(f"正在减数:{n}") # 通过日志输出信息
        n -= 1
        time.sleep(1)


def main():
    """
    Thread(group=None, target=None, name=None, args=(), kwargs=None, daemon=None)
    A class that represents a thread of control.
    """
    # Thread(target=work_name).start()
    Thread_list = []
    for i in range(3):
        t = Thread(target=countdown, args=(3, )) # 启动3个线程运行countdown函数
        t.start()
        Thread_list.append(t)
    
    for i in Thread_list:
        i.join() # Wait until the thread terminates. # 终止


if __name__ == "__main__":
    main()
>>>
MainThread:start
Thread-1  :正在减数:3
Thread-2  :正在减数:3
Thread-3  :正在减数:3
Thread-2  :正在减数:2
Thread-3  :正在减数:2
Thread-1  :正在减数:2
Thread-2  :正在减数:1
Thread-1  :正在减数:1
Thread-3  :正在减数:1
MainThread:stop

猜你喜欢

转载自blog.csdn.net/qq_39591494/article/details/89196205
今日推荐