首頁 > 軟體

python中的多cpu並行程式設計

2022-05-17 13:00:49

多cpu並行程式設計

  • python多執行緒只能算並行,因為它智慧使用一個cpu核心
  • python下pp包支援多cpu平行計算

安裝

pip install pp

使用

#-*- coding: UTF-8 -*-
import math, sys, time
import pp
def IsPrime(n):
    """返回n是否是素數"""
    if not isinstance(n, int):
        raise TypeError("argument passed to is_prime is not of 'int' type")
    if n < 2:
        return False
    if n == 2:
        return True
    max = int(math.ceil(math.sqrt(n)))
    i = 2
    while i <= max:
        if n % i == 0:
            return False
        i += 1
    return True
def SumPrimes(n):
    for i in xrange(15):
        sum([x for x in xrange(2,n) if IsPrime(x)])
    """計算從2-n之間的所有素數之和"""
    return sum([x for x in xrange(2,n) if IsPrime(x)])
inputs = (100000, 100100, 100200, 100300, 100400, 100500, 100600, 100700)
# start_time = time.time()
# for input in inputs:
#     print SumPrimes(input)
# print '單執行緒執行,總耗時', time.time() - start_time, 's'
# # tuple of all parallel python servers to connect with
ppservers = ()
#ppservers = ("10.0.0.1",)
if len(sys.argv) > 1:
    ncpus = int(sys.argv[1])
    # Creates jobserver with ncpus workers
    job_server = pp.Server(ncpus, ppservers=ppservers)
else:
    # Creates jobserver with automatically detected number of workers
    job_server = pp.Server(ppservers=ppservers)
print "pp 可以用的工作核心執行緒數", job_server.get_ncpus(), "workers"
start_time = time.time()
jobs = [(input, job_server.submit(SumPrimes,(input,), (IsPrime,), ("math",))) for input in inputs]#submit提交任務
for input, job in jobs:
    print "Sum of primes below", input, "is", job()# job()獲取方法執行結果
print "多執行緒下執行耗時: ", time.time() - start_time, "s"
job_server.print_stats()#輸出執行資訊

執行結果

pp 可以用的工作核心執行緒數 4 workers
Sum of primes below 100000 is 454396537
Sum of primes below 100100 is 454996777
Sum of primes below 100200 is 455898156
Sum of primes below 100300 is 456700218
Sum of primes below 100400 is 457603451
Sum of primes below 100500 is 458407033
Sum of primes below 100600 is 459412387
Sum of primes below 100700 is 460217613
多執行緒下執行耗時:  15.4971420765 s
Job execution statistics:
 job count | % of all jobs | job time sum | time per job | job server
         8 |        100.00 |      60.9828 |     7.622844 | local
Time elapsed since server creation 15.4972219467
0 active tasks, 4 cores

submit 函數定義

def submit(self, func, args=(), depfuncs=(), modules=(),
        callback=None, callbackargs=(), group='default', globals=None):
    """Submits function to the execution queue
 
        func - function to be executed  執行的方法
        args - tuple with arguments of the 'func' 方法傳入的引數,使用元組
        depfuncs - tuple with functions which might be called from 'func' 傳入自己寫的方法 ,元組
        modules - tuple with module names to import  傳入 模組
        callback - callback function which will be called with argument
                list equal to callbackargs+(result,)
                as soon as calculation is done
        callbackargs - additional arguments for callback function
        group - job group, is used when wait(group) is called to wait for
        jobs in a given group to finish
        globals - dictionary from which all modules, functions and classes
        will be imported, for instance: globals=globals()
    """

多核cpu平行計算

  • 多程序實現平行計算的簡單範例
  • 這裡我們開兩個程序,計算任務也簡潔明瞭
# 多程序
import multiprocessing as mp
def job(q, a, b):
    print('aaa')
    q.put(a**1000+b*1000)  # 把計算結果放到佇列
# 多程序
if __name__ == '__main__':
    q = mp.Queue()  # 一個佇列
    p1 = mp.Process(target=job, args=(q, 100, 200))
    p2 = mp.Process(target=job, args=(q, 100, 200))
    p1.start()
    p1.join()
    # print(p1.ident)
    p2.start()
    p2.join()
    res = q.get() + q.get()  # 讀取佇列,這裡面儲存了兩次計算得到的結果
    print('result:', res)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com