Python 多线程编程入门

jackwangcumt 发表于 2021/12/03 21:51:55 2021/12/03
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。