前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python多线程实现程序加速

Python多线程实现程序加速

作者头像
算法工程师之路
发布2019-08-05 20:22:01
9230
发布2019-08-05 20:22:01
举报

多线程即同时执行多个应用程序,这样可以减少时间消耗,提高程序性能,所以下面就和大家分享Python中多线程的实现。主要包括以下几个方面:

  1. 什么是Python中的多任务处理?
  2. 什么是线程?
  3. 何时在Python中使用多线程?
  4. 如何在Python中实现多线程?
  5. 多线程的优点

什么是Python中的多任务处理?

通常,多任务处理是同时执行多个任务的能力。在技术方面,多任务处理是指操作系统同时执行不同任务的能力。例如,您正在PC上下载内容以及收听歌曲和同时玩游戏等。所有这些任务都由同一个OS同步执行。这不过是多任务处理,它不仅可以帮助您节省时间,还可以提高工作效率。操作系统中有两种类型的多任务处理:

  • 基于进程
  • 基于线程

什么是线程?

线程基本上是一个独立的执行流程。单个进程可以包含多个线程。程序中的每个线程都执行特定任务。例如,当你在PC上玩游戏时说FIFA,整个游戏只是一个进程,但它由几个负责播放音乐,接受用户输入,同步运行游戏等的线程组成。所有这些都是独立的线程,负责在同一程序中执行这些不同的任务。每个进程都有一个始终在运行的线程。这是主线程。这个主线程实际上创建了子线程对象。子线程也由主线程启动。

何时在Python中使用多线程?

多线程对于节省时间和提高性能非常有用,但它也有一些应用限制。在之前的FIFA示例中,音乐线程独立于获取输入的线程,而获取输入的线程独立于运行游戏的线程。这些线程独立运行,因为它们不是相互依赖的。因此只有各个线程之间不存在依赖关系时才能使用多线程。

如何在Python中实现多线程?

Python中的多线程可以通过导入threading模块来实现。在导入此模块之前,可以使用pip3安装。要在anaconda环境中可以使用conda命令安装。

代码语言:javascript
复制
conda install -c conda-forge tbb

成功安装后,您可以使用以下一个命令导入threading模块:

代码语言:javascript
复制
import threading 
from threading import *

如何在Python中创建线程?

Python中的线程可以通过三种方式创建:

  1. 没有创建一个类
  2. 通过扩展Thread类
  3. 没有扩展Thread类

没有创建一个类

Python中的多线程也可以在不创建类的情况下完成。以下是一个示例:

代码语言:javascript
复制
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语句。输出结果为:

代码语言:javascript
复制
MainThread
Child Thread
Executing thread name : MainThread

扩展Thread类:

通过扩展Thread类创建子类时,子类表示新线程正在执行某个任务。扩展Thread类时,子类只能覆盖两个方法,即__init __()方法和run()方法。除了这两种方法之外,没有其他方法可以被覆盖。以下是如何扩展Thread类以创建线程的示例:

代码语言:javascript
复制
import threading
import time
class 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())

输出结果为:

代码语言:javascript
复制
Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Bye from MainThread

上面的例子表明myclass类继承了Thread类和子类,即myclass重写了run方法。默认情况下,任何类函数的第一个参数都需要是self,它是指向当前对象的指针。输出显示子线程执行run()方法,主线程等待子进程执行完成。这是因为join()函数使主线程等待子进程完成。这种创建线程的方法是最标准的方法,但是如果您想在不继承或扩展Thread类的情况下创建线程,可以参见下一个示例。

没有扩展Thread类

要在不扩展Thread类的情况下创建线程,可以通过以下示例代码:

代码语言:javascript
复制
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语句。输出结果为:

代码语言:javascript
复制
Child
Child
Child
Child
Child
Child
Child
done

使用线程的优点

总结多线程的优点如下:

  • 更好地利用资源
  • 简化代码
  • 允许并发和并行发生各种任务
  • 减少时间消耗或响应时间,从而提高性能。

下面通过一个示例来比较在python中使用和不使用多线程执行代码所需的时间:

首先我们计算不使用线程所需要的时间,程序如下:

代码语言:javascript
复制
import time
def sqr(n):
    for x in n:
        time.sleep(1)
        x%2
def cube(n):
    for x in n:
        time.sleep(1)
        x%3
n=[1,2,3,4,5,6,7,8]
s=time.time()
sqr(n)
cube(n)
e=time.time()
print(e-s)

需要时间为:16.042309284210205。下面我们使用线程,计算时间代码如下:

代码语言:javascript
复制
import threading
from threading import *
import time
def 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!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Python中的多任务处理?
  • 什么是线程?
  • 何时在Python中使用多线程?
  • 如何在Python中实现多线程?
  • 如何在Python中创建线程?
    • 没有创建一个类
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档