python线程如何创建和传参

这篇文章将为大家详细讲解有关python线程如何创建和传参,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

创新互联是一家集网站建设,宁化企业网站建设,宁化品牌网站建设,网站定制,宁化网站建设报价,网络营销,网络优化,宁化网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

一.线程解释

线程是cpu最小调度单位,一个程序中至少有一个或者多个线程(至于进程暂时不做讲解,后面文章会有详细解释)!在开发中使用线程可以让程序运行效率更高,多线程类似于同时执行多个不同代码块。

二.线程创建和启动

1.导入线程模块

1

2

# 导入线程threading模块

importthreading

2.创建线程并初始化线程

调用threading模块中的缺省函数Thread,创建并初始化线程,返回线程句柄。如果对缺省函数已经忘记的小伙伴请回到 python函数的声明和定义中关于缺省参数部分复习一下。

1

2

# 创建并初始化线程,返回线程句柄

t=threading.Thread(target=函数名)

3.启动线程

通过初始化返回的线程句柄调用start()函数,启动线程,此时会自动执行在创建线程时target对应的函数内部的代码:

1

2

# 启动线程

t.start()

综合上面三点,下面使用代码对python线程thread做详细讲解:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

# !usr/bin/env python

# -*- coding:utf-8 _*-

"""

@Author:何以解忧

@Blog(个人博客地址): shuopython.com

@WeChat Official Account(微信公众号):猿说python

@Github:www.github.com

@File:python_thread.py

@Time:2019/10/16 21:02

 

@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

"""

# 导入线程threading模块

importthreading

# 导入内置模块time

importtime

 

defwash_clothes():

    print("洗衣服开始...")

    # sleep 5 秒,默认以秒为单位

    time.sleep(5)

    print("洗衣服完成...")

 

defclean_room():

    print("打扫房间开始...")

    # sleep 5 秒,默认以秒为单位

    time.sleep(5)

    print("打扫房间完成...")

 

if__name__=="__main__":

 

    # 创建线程并初始化 -- 该线程执行wash_clothes中的代码

    t1=threading.Thread(target=wash_clothes)

    # 创建线程并初始化 -- 该线程执行clean_room中的代码

    t2=threading.Thread(target=clean_room)

 

    t1.start()

    t2.start()

输出结果:

1

2

3

4

洗衣服开始...

打扫房间开始...

洗衣服完成...

打扫房间完成...

运行程序可以发现程序从运行开始到结束,一共耗时5秒时间!注意观察输出日志:

  • 一:洗衣服开始和打扫房间开始几乎同时开始,两个事件同时执行.

  • 二:程序停止5秒;

  • 三:洗衣服和打扫房间几乎同时完成

当然你也可以按照以前的学习的内容,先调用wash_clothes函数,在调用clean_room函数,同样能输出内容,而耗时却是10秒左右,示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# 导入内置模块time

importtime

 

defwash_clothes():

    print("洗衣服开始...")

    # sleep 5 秒,默认以秒为单位

    time.sleep(5)

    print("洗衣服完成...")

 

defclean_room():

    print("打扫房间开始...")

    # sleep 5 秒,默认以秒为单位

    time.sleep(5)

    print("打扫房间完成...")

 

if__name__=="__main__":

 

    wash_clothes()

    clean_room()

输出结果:

1

2

3

4

洗衣服开始...

洗衣服完成...

打扫房间开始...

打扫房间完成...

运行程序可以发现程序从运行开始到结束,一共耗时10秒时间!注意观察输出日志:

  • 一:洗衣服开始;

  • 二:程序停止了5秒;

  • 三:洗衣服完成,打扫房间开始

  • 四:程序停止5秒;

  • 五:打扫房间结束,程序结束;

由此可见:多线程可以同时运行多个任务,效率远比单线程更高!

三.线程传参

在上面的demo中,我们并没有为线程传递参数,如果在线程中需要传递参数怎么办呢?

threading.Thread()函数中有两个缺省参数 args 和 kwargs ,args 是元组类型,kwargs 是字典类型,缺省值默认为空,除此之外,其实还可以设置线程的名字等,其函数声明如下:

(ps:如果对缺省函数已经忘记的小伙伴请回到 python函数的声明和定义中关于缺省参数部分复习一下)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

def__init__(self,group=None,target=None,name=None,

            args=(),kwargs=None,*,daemon=None):

    """This constructor should always be called with keyword arguments. Arguments are:

 

    *group* should be None; reserved for future extension when a ThreadGroup

    class is implemented.

 

    *target* is the callable object to be invoked by the run()

    method. Defaults to None, meaning nothing is called.

 

    *name* is the thread name. By default, a unique name is constructed of

    the form "Thread-N" where N is a small decimal number.

 

    *args* is the argument tuple for the target invocation. Defaults to ().

 

    *kwargs* is a dictionary of keyword arguments for the target

    invocation. Defaults to {}.

 

    If a subclass overrides the constructor, it must make sure to invoke

    the base class constructor (Thread.__init__()) before doing anything

    else to the thread.

 

    """

示例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

# 导入线程threading模块

importthreading

# 导入内置模块time

importtime

 

defwash_clothes(*args,**kargcs):

    print("wash_clothes:",args)

    print("wash_clothes:",kargcs)

 

defclean_room(*args,**kargcs):

    print("clean_room:",args)

    print("clean_room:",kargcs)

 

if__name__=="__main__":

 

    t1=threading.Thread(target=wash_clothes,

                          args=(1,"猿说python"),  # args 传递元组,可以同时传递多个数据

                          kwargs={"a":1,"b":False})# kwargs 传递字典,可以同时传递多个键值对

 

    t2=threading.Thread(target=clean_room,

                          args=(2,False),# args 传递元组,可以同时传递多个数据

                          kwargs={"c":0.2,"d":False})# kwargs 传递字典,可以同时传递多个键值对

 

    t1.start()

    t2.start()

四.线程结束

值得思考的是:在上面这份代码中一共有几个线程呢?并非两个,一共是三个线程:

  • 线程一:__name__ == “__main__” 作为主线程;

  • 线程二:t1 作为子线程;

  • 线程三:t2 作为子线程;

注意:主程序会等待所有子程序结束之后才会结束!

五.相关函数介绍

1.threading.Thread() — 创建线程并初始化线程,可以为线程传递参数 ;

2.threading.enumerate() — 返回一个包含正在运行的线程的list;

3.threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果;

4.Thread.start() — 启动线程 ;

5.Thread.join() — 阻塞函数,一直等到线程结束为止 ;

6.Thread.isAlive() — 返回线程是否活动的;

7.Thread.getName() — 返回线程名;

8.Thread.setName() — 设置线程名;

9.Thread.setDaemon() — 设置为后台线程,这里默认是False,设置为True之后则主线程不会再等待子线程结束才结束,而是主线程结束意味程序退出,子线程也立即结束,注意调用时必须设置在start()之前;

简单的示例代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

# 导入线程threading模块

importthreading

# 导入内置模块time

importtime

 

defwash_clothes(*args,**kargcs):

    time.sleep(2)

    print("wash_clothes:",args)

    time.sleep(2)

    print("wash_clothes:",kargcs)

 

defclean_room(*args,**kargcs):

    time.sleep(2)

    print("clean_room:",args)

    time.sleep(2)

    print("clean_room:",kargcs)

 

if__name__=="__main__":

 

    t1=threading.Thread(target=wash_clothes,

                          args=(1,"猿说python"),  # args 传递元组,可以同时传递多个数据

                          kwargs={"a":1,"b":False})# kwargs 传递字典,可以同时传递多个键值对

 

    t2=threading.Thread(target=clean_room,

                          args=(2,False),# args 传递元组,可以同时传递多个数据

                          kwargs={"c":0.2,"d":False})# kwargs 传递字典,可以同时传递多个键值对

 

 

    # setDaemon(True)意味着主线程退出,不管子线程执行到哪一行,子线程自动结束

    # t1.setDaemon(True)

    # t2.setDaemon(True)

    t1.start()

    t2.start()

 

    print("threading.enumerate():",threading.enumerate())

    print("threading.activeCount():",threading.activeCount())

    print("t1.isAlive():",t1.isAlive())

    print("t1.getName():",t1.getName())

    print("t2.isAlive():",t2.isAlive())

    t2.setName("my_custom_thread_2")

    print("t2.getName():",t2.getName())

输出结果:

1

2

3

4

5

6

7

8

9

10

threading.enumerate():[<_MainThread(MainThread,started18388)>,,]

threading.activeCount():3

t1.isAlive():True

t1.getName():Thread-1

t2.isAlive():True

t2.getName():my_custom_thread_2

clean_room:(2,False)

wash_clothes:(1,'猿说python')

wash_clothes:{'a':1,'b':False}

clean_room:{'c':0.2,'d':False}

关于“python线程如何创建和传参”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


网页标题:python线程如何创建和传参
URL分享:http://ybzwz.com/article/ipgggh.html