Python 从入门到实战38(创建线程)

        我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。

        上篇文章我们讨论了通过进程间通信操作的相关知识。今天学习一下创建线程的方法。

1、线程的介绍

        如果我们需要同时处理多个任务,可以有两种方法来实现:1、可以在一个应用程序内使用多个进程,每个进程负责完成一部分工作;2、一个进程内使用多个线程来处理不同的任务。

        线程-thread:是操作系统能够运行运算调度的最小单位。线程被包含在进程中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同的任务。如我们经常看的视频,对于播放器来说,显示视频用一个线程,播放音频用另外一个线程。两个线程同时工作才能保证我们看到画面和声音同步的视频。

2、创建线程

python 的标准库提供了两个模块可以创建进程,即_thread 和 threading

其中_thread 是低级模块,threading 是高级模块。我们使用threading 这个高级模块就可以了。

1)使用threading 创建进程

threading 模块提供了一个Thread 类来代表一个线程对象,其使用语法:

Thread(group,target,name,args,kwargs)

参数说明:

group ------ 值为None,为以后版本而保留;

target------表示一个可调用对象,线程启动时,run()方法将调用此对象。默认值为None,表示不调用任何对象

name------表示当前线程名称,默认创建一个Thread-N 格式的唯一名称;

args-----表示传递给target 函数的参数元组

kwargs------表示传递给target函数的参数字典;

补充知识:列表推导式写法

Python中有一种叫做列表推导式(list comprehension)的简洁写法,它可以用来生成一个新的列表。

for i in range(4) 是一个迭代器,会生成一个序列:0, 1, 2, 3,共4个数。

如果有其他的表达式与之关联,例如:a = [i for i in range(4)]

这个表达式会生成一个新的列表 [0, 1, 2, 3]。

如果有更复杂的应用,例如:

a = [i*2 for i in range(4)]

这个表达式会生成一个新的列表 [0, 2, 4, 6]。

列表推导式的一般格式是:

[expression for item in sequence]

其中,expression 是你想要对序列sequence 中的每一个item 进行的操作,然后返回一个新的列表。

如果你想要对条件进行筛选,可以这样写:

a = [i for i in range(10) if i % 2 == 0]

这个表达式会生成一个新的列表 [0, 2, 4, 6, 8]。

举例说明:

#线程执行的函数
def process():
    for j in range(2):
        time.sleep(1)
        print("thread name is %s"%threading.current_thread().name)  #打印当前线程名字

def main():
    print("=========主线程开始=========")
    threads = [threading.Thread(target=process) for i in range(3)]  #创建3个线程,存入列表中,列表推导式的运用
    for th in threads:
        th.start()     #开启线程
    for th in threads:
        th.join()     #等待子线程结束
    print("==========主线程结束========")


if __name__=="__main__":
    main()

参考结果:可以从执行结果来看出,线程之间的执行顺序并不是确定的。

2)使用thread字类创建线程

Thread 线程类和process 进程类使用方式比较相似。也可以通过定义一个继承Thread线程类的字类来创建线程。下面举例说明。

#通过Thread 子类创建2个线程,每个线程延时2秒展示
class SubThread(threading.Thread):
    #重写函数run
    def run(self):
        for i in range(2):
            time.sleep(1)
            message = "子线程" + self.name + '执行,i=' + str(i)
            print(message)

def main():
    print("=============主线程开始===========")
    #子类实例化创建线程
    th1 = SubThread()
    th2 = SubThread()

    #启动子线程
    th1.start()
    th2.start()
    #等待子线程
    th1.join()
    th2.join()
    print("=============主线程结束===========")

输出结果参考:

今天先写学习到这里了,每天进步一点点。明天也要加油啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立黄昏粥可温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值