我们的目标是:通过这一套资料学习下来,可以熟练掌握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("=============主线程结束===========")
输出结果参考:
今天先写学习到这里了,每天进步一点点。明天也要加油啊!