python threading多线程计算

本文持续更新…

threading 模块

当前运行的线程

一个进程可以有多个线程,通过threading模块来实现多线程计算,下面显示当前线程名

import threading

def main():
    print(threading.current_thread().getName())

if __name__=='__main__':
    main()

在这里插入图片描述
上面结果显示的是:我们当前运行的是主线程mainthread. 现在我们增加一个新的线程。

import threading

print(threading.current_thread().getName())

def sum_func(a,b):
    t = threading.current_thread()
    print(t.getName())  #當前線程名
    print(sum([a,b]))
    

new_t = threading.Thread(target=sum_func,args=(1,2)) #新加一個線程
new_t.start()    #開始線程計算

在这里插入图片描述
默认名字是Thread-1,通过下面的程序可以改名字

new_t = threading.Thread(target=sum_func,args=(1,2),name='new-thread')改名为new-thread

这里有一个反常的现象: 通常而言,单线程计算会先计算完第一个才进入第二个,而当我们使用thread模块之后,会综合利用CPU性能同时计算多个函数。

import threading
import time

print(threading.current_thread().getName())

def sum_func(a,b):
    t = threading.current_thread()
    print(t.getName())  #當前線程名
    time.sleep(3)
    print(sum([a,b]))
    

new_t = threading.Thread(target=sum_func,args=(1,2),name='new-thread') #新加一個線程
new_t.start()    #開始線程計算

print('end thread')

在这里插入图片描述
分析一下上面的结果,我们发现,如果是单线程的话,应该是sum_func先计算完,也就是计算完new_t.start()之后才会进入print(‘end thread’)语句,而从输出结果看,这个print在sum([a,b])之前完成了。这说明不是按照常规顺序进行的,而是综合CPU性能多个一起计算了,从而print(‘end thread’)被先执行了。

例子

这里给一个稍微复杂的书上的例子,用于计算斐波那契数列,阶乘,和求和。第一种是使用单线程进行的,第二个是使用多线程进行的。我们的目的是对比它们所花的时间。

#!/usr/bin/env python

from time import ctime, sleep
import threading
from time import sleep, ctime

loops = [4, 2]


class MyThread(threading.Thread):
    def __init__(self, func, args, name='', verb=False):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args
        self.verb = verb

    def getResult(self):
        return self.res

    def run(self):
        if self.verb:
            print(('starting', self.name, 'at:', ctime()))
        self.res = self.func(*self.args)
        if self.verb:
            print((self.name, 'finished at:', ctime()))

def fib(x):
    sleep(0.005)
    if x < 2:
        return 1
    return (fib(x-2) + fib(x-1))


def fac(x):
    sleep(0.1)
    if x < 2:
        return 1
    return (x * fac(x-1))


def sum(x):
    sleep(0.1)
    if x < 2:
        return 1
    return (x + sum(x-1))


funcs = (fib, fac, sum)
n = 13


def main():
    nfuncs = list(range(len(funcs)))

    print('*** SINGLE THREAD')
    print('starting single thread at:',ctime())
    for i in nfuncs:
        # print('starting', funcs[i].__name__, \
	    # 'at:', ctime())
        print(funcs[i](n))
        # print(funcs[i].__name__, 'finished at:', \
        #     ctime())
    print('end single thread at:',ctime())
    print('\n*** MULTIPLE THREADS')
    print('starting multiple threads at:',ctime())
    threads = []
    for i in nfuncs:
        t = MyThread(funcs[i], (n,),
                     funcs[i].__name__)
        threads.append(t)

    for i in nfuncs:
        threads[i].start()

    for i in nfuncs:
        threads[i].join()
        print(threads[i].getResult())
    print('end multiple threads at:',ctime())
    print('all DONE')

if __name__ == '__main__':
    main()

在这里插入图片描述
实际上多线程花的时间就是计算最慢的那个函数所花的时间。

猜你喜欢

转载自blog.csdn.net/Mr_Cat123/article/details/103795407
今日推荐