Python 多线程编程入门
【摘要】 Python作为一种简单,应用场景众多的编程语言,有些时候需要启用多线程技术来提升效率。在Python 3版本中,多线程常用的模块为:_thread和threading,其中推荐使用threading,且threading模块涵盖_thread模块的功能,并提供更多的API可以更方便的进行多线程的编程。
1 多线程概述
根据百度百科的定义,多线程(Multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(Thread),进而可能提升整体处理性能。具有多线程能力的软件一般需要运行在多核处理器芯片上。在一个程序中(一般可以称为进程),这些独立运行的程序片段叫作线程,利用它编程的概念就叫作多线程编程。
当前随着计算机技术的快速发展,硬件的价格已经越来越廉价,因此,当前的计算机多数都是多核的CPU,因此,如果不借助多线程编程,则可能不能完全释放硬件的能力,且程序处理的体验以及效率都不高。但是需要注意,多线程往往会和并发概念有关联,因此,编写健壮的、线程安全的多线程程序,也是需要有众多的注意点的。否则可能导致程序的运行结果不正确,且此类错误难以排查。
2 Python多线程概述
Python作为一种简单,应用场景众多的编程语言,有些时候需要启用多线程技术来提升效率。在Python 3版本中,多线程常用的模块为:_thread和threading,其中推荐使用threading,且threading模块涵盖_thread模块的功能,并提供更多的API可以更方便的进行多线程的编程。在 Python3 中不能使用thread 模块。为了兼容性,它将 thread 重命名为 _thread。
3 Python多线程示例
为了说明Python 的多线程编程,下面给出一个简单的示例,具体的代码如下所示:
import _thread as thread
import time
def sum(n):
ret = 0
for i in range (1 ,n + 1):
ret += 1
time.sleep(2)
print ("%d" % (ret))
return ret
try:
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
tid = thread.start_new_thread(sum, (100,) )
print ("%d" % (tid))
#Error: 2nd arg must be a tuple
tid2 = thread.start_new_thread(sum, (200,) )
print ("%d" % (tid2))
print(">>>>>>>>>>>>>>>>>>")
except Exception as ex:
print ("Error:",ex)
finally:
#wait
time.sleep(3)
print("=================")
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) )
首先用 import _thread as thread 导入_thread 模块并用as进行重命名为thread 。import time用来记录时间和进行暂停操作,如 time.sleep(2)暂停2秒。一般来说,一个线程就是运行一段代码,一般为一个函数,这里定义了一个sum函数,其中就是求和的操作。tid = thread.start_new_thread(sum, (100,) )用start_new_thread方法启动了一个新线程,线程中要执行的函数为sum,参数必须为一个元组,特别是1个参数时,末尾的,不能少。start_new_thread方法返回一个线程的ID标识,是一个Int类型的值。
注意:在finally块,用了一个time.sleep(3)暂停了主线程3秒中,否则子线程还没有执行完,就退出主线程,则可能无法看到计算中间结果。
多线程程序有一个特点就是,输出的结果具有随机性(执行顺序),下面给出一个输出结果如下所示:
2021-12-03 20:48:09
17024
21432
>>>>>>>>>>>>>>>>>>
100
200
=================
2021-12-03 20:48:12
从结果中看,程序整个耗时在3秒,而每个线程的计算耗时为2秒多,这就说明,2个线程是并行执行的,而不是串行的,都在应该在4秒多完成。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)