Python多线程实现程序加速

论坛 期权论坛 期权     
算法工程师之路   2019-7-21 15:20   4944   0
喜欢就点关注吧!
多线程即同时执行多个应用程序,这样可以减少时间消耗,提高程序性能,所以下面就和大家分享Python中多线程的实现。主要包括以下几个方面:
  • 什么是Python中的多任务处理?
  • 什么是线程?
  • 何时在Python中使用多线程?
  • 如何在Python中实现多线程?
  • 多线程的优点
什么是Python中的多任务处理?通常,多任务处理是同时执行多个任务的能力。在技术方面,多任务处理是指操作系统同时执行不同任务的能力。例如,您正在PC上下载内容以及收听歌曲和同时玩游戏等。所有这些任务都由同一个OS同步执行。这不过是多任务处理,它不仅可以帮助您节省时间,还可以提高工作效率。操作系统中有两种类型的多任务处理:
  • 基于进程
  • 基于线程
什么是线程?


线程基本上是一个独立的执行流程。单个进程可以包含多个线程。程序中的每个线程都执行特定任务。例如,当你在PC上玩游戏时说FIFA,整个游戏只是一个进程,但它由几个负责播放音乐,接受用户输入,同步运行游戏等的线程组成。所有这些都是独立的线程,负责在同一程序中执行这些不同的任务。每个进程都有一个始终在运行的线程。这是主线程。这个主线程实际上创建了子线程对象。子线程也由主线程启动。
何时在Python中使用多线程?多线程对于节省时间和提高性能非常有用,但它也有一些应用限制。在之前的FIFA示例中,音乐线程独立于获取输入的线程,而获取输入的线程独立于运行游戏的线程。这些线程独立运行,因为它们不是相互依赖的。因此只有各个线程之间不存在依赖关系时才能使用多线程。
如何在Python中实现多线程?Python中的多线程可以通过导入threading模块来实现。在导入此模块之前,可以使用pip3安装。要在anaconda环境中可以使用conda命令安装。
  1. conda install -c conda-forge tbb
复制代码
成功安装后,您可以使用以下一个命令导入threading模块:
  1. import threading from threading import *
复制代码
如何在Python中创建线程?Python中的线程可以通过三种方式创建:
  • 没有创建一个类
  • 通过扩展Thread类
  • 没有扩展Thread类
[h1]没有创建一个类[/h1]Python中的多线程也可以在不创建类的情况下完成。以下是一个示例:
  1. from threading import *print(current_thread().getName())def mt():    print("Child Thread")child=Thread(target=mt)child.start()print("Executing thread name :",current_thread().getName())
复制代码
程序表示第一个线程是主线程。然后,该主线程创建一个正在执行该函数的子线程,然后由主线程再次执行最终的print语句。输出结果为:
  1. MainThreadChild ThreadExecuting thread name : MainThread
复制代码
扩展Thread类:
通过扩展Thread类创建子类时,子类表示新线程正在执行某个任务。扩展Thread类时,子类只能覆盖两个方法,即__init __()方法和run()方法。除了这两种方法之外,没有其他方法可以被覆盖。以下是如何扩展Thread类以创建线程的示例:
  1. import threadingimport timeclass mythread(threading.Thread):    def run(self):        for x in range(7):        print("Hi from child")a = mythread()a.start()a.join()print("Bye from",current_thread().getName())
复制代码
输出结果为:
  1. Hi from childHi from childHi from childHi from childHi from childHi from childHi from childBye from MainThread
复制代码
上面的例子表明myclass类继承了Thread类和子类,即myclass重写了run方法。默认情况下,任何类函数的第一个参数都需要是self,它是指向当前对象的指针。输出显示子线程执行run()方法,主线程等待子进程执行完成。这是因为join()函数使主线程等待子进程完成。这种创建线程的方法是最标准的方法,但是如果您想在不继承或扩展Thread类的情况下创建线程,可以参见下一个示例。

没有扩展Thread类
要在不扩展Thread类的情况下创建线程,可以通过以下示例代码:
  1. from threading import *class ex:def myfunc(self): #self necessary as first parameter in a class func    for x in range(7):        print("Child")myobj=ex()thread1=Thread(target=myobj.myfunc)thread1.start()thread1.join()print("done")
复制代码
程序通过子线程执行myfunc,之后主线程执行最后一个print语句。输出结果为:
  1. ChildChildChildChildChildChildChilddone
复制代码
使用线程的优点
总结多线程的优点如下:
  • 更好地利用资源
  • 简化代码
  • 允许并发和并行发生各种任务
  • 减少时间消耗或响应时间,从而提高性能。
下面通过一个示例来比较在python中使用和不使用多线程执行代码所需的时间:
首先我们计算不使用线程所需要的时间,程序如下:
  1. import timedef sqr(n):    for x in n:        time.sleep(1)        x%2def cube(n):    for x in n:        time.sleep(1)        x%3n=[1,2,3,4,5,6,7,8]s=time.time()sqr(n)cube(n)e=time.time()print(e-s)
复制代码
需要时间为:16.042309284210205。下面我们使用线程,计算时间代码如下:
  1. import threadingfrom threading import *import timedef sqr(n):    for x in n:        time.sleep(1)        print('Remainder after dividing by 2',x%2)def cube(n):    for x in n:        time.sleep(1)        print('Remainder after dividing by 3',x%3)n=[1,2,3,4,5,6,7,8]start=time.time()t1=Thread(target=sqr,args=(n,))t2=Thread(target=cube,args=(n,))t1.start()time.sleep(1)t2.start()t1.join()t2.join()end=time.time()print(end-start)
复制代码

需要时间为:9.040220737457275。通过以上一个简单的示例比较可以看出与不使用线程执行相同程序所花费的时间相比,我们使用线程所花费的时间要少得多。因此在执行多个相互间不冲突的任务时,可以通过多线程进行程序加速。

参考
https://www.edureka.co/blog/artificial-intelligence-applications/



▼更多精彩推荐,请关注我们▼

长按二维码关注算法工程师之路算法工程师
我们一起努力,For World!
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP