1. 程式人生 > >Parallel Python(pp)分散式計算框架安裝和配置問題(基於win10系統)

Parallel Python(pp)分散式計算框架安裝和配置問題(基於win10系統)

“分散式計算”也是當今IT行業的一個非常火熱的名詞,大家都知道的谷歌機房,還有2013年諾貝爾物理學獎獲獎專案“希格斯波色子”,都利用了“分散式計算”來分擔一部分計算量從而提高計算效率,尤其在資料科學領域“分散式計算”起到舉足輕重的作用。
ParallelPython簡稱pp,是一個基於Python的分散式計算框架,有很多朋友都會用到。
別的也不多說,迴歸主題,可能有很多像我一樣的剛剛接觸Python又獨愛win10的菜鳥,在使用“pip install pp”安裝pp時都會遇到各種安裝錯誤導致無法安裝。

比如這樣:這裡寫圖片描述

可能在官網下載了wheel檔案安裝時也會遇到錯誤,比如下圖:
這裡寫圖片描述

於是按照提示去檢查程式碼,但並未找到問題:
這裡寫圖片描述

那這下該怎麼辦呢?

然後找到“Windows installer”,這是一個pp的exe格式安裝包,官網上有兩個“Windows installer”,根據自己需要的版本進行下載。如下圖:
這裡寫圖片描述
筆者下載的是最新的pp-1.6.6.exe md5,下載後會得到如下檔案:
這裡寫圖片描述

現在開啟剛剛下載的“pp-1.6.6.exe”,進入到以下安裝介面:
這裡寫圖片描述

點選“下一步”,這時我們進入到配置環境,pp安裝時會自動掃描自己電腦裡安裝的Python環境,有很多朋友會像我一樣同時安裝了兩個甚至多個版本的Python,此時我們只需要選擇一個我們要使用的Python版本進行安裝,在這裡我選擇的是Anaconda的Python3.6,至於“Python Directory”和“Installation Directory”的路徑也是自動搜尋到的,不用管它,然後點選“下一步


(ps:在這裡我強烈建議大家使用Anaconda,尤其是處理資料科學的朋友,Anaconda是一個非常棒的管理庫的程式,安裝時自帶了基本所有要用到的庫,也可以手動安裝一些第三方庫,更關鍵的是,有圖形介面,不是黑框框!可以不用pip!像我這種懶蛋,點點滑鼠就能安裝很多第三方庫!)
這裡寫圖片描述

進入到以下介面,繼續點選“下一步”:
這裡寫圖片描述

一秒鐘後,我們的安裝就結束了,點選“完成”:
這裡寫圖片描述

現在已經安裝好了,但是這樣就結束工作了嗎?

等等!還沒完!!!

當我們真的要使用pp時,可能會遇到這個問題:
這裡寫圖片描述
原因很簡單,是因為pp的版本out了。因為這個版本是2017年更新的,而我們用到的Python版本可能是新版,比如我使用的是Python3.6.5,而新版本的語法有些改變,print

被改為了print()我們要手動進行更改,還有一些庫的名稱和內容也有更改,這裡就不做過多贅述了。

首先進入到我們的Python所在的資料夾“Lib\site-packages”(Anaconda的使用者為:Anaconda3\Lib\site-packages),找到“pp.py”,然後用編輯器將其開啟,進行修改:
這裡寫圖片描述
這裡寫圖片描述

改為以下:

在第121行改為:print(sout),
這裡寫圖片描述
第534行至第555行改為:
這裡寫圖片描述
這裡我附上程式碼:


        print ("Job execution statistics:")
        walltime = time.time() - self.__creation_time
        statistics = self.get_stats().items()
        totaljobs = 0.0
        for ppserver, stat in statistics:
            totaljobs += stat.njobs
        print (" job count | % of all jobs | job time sum | " \
                "time per job | job server")
        for ppserver, stat in statistics:
            if stat.njobs:
                print( "    %6i |        %6.2f |     %8.4f |  %11.6f | %s" \
                        % (stat.njobs, 100.0*stat.njobs/totaljobs, stat.time,
                        stat.time/stat.njobs, ppserver, ))
        print( "Time elapsed since server creation", walltime)
        print (self.__active_tasks, "active tasks,", self.get_ncpus(), "cores")

        if not self.__accurate_stats:
            print( "WARNING: statistics provided above is not accurate" \
                  " due to job rescheduling")
        print

同時把開頭的匯入部分改為:

import os
import threading
import logging
import inspect
import sys
import types
import time
import atexit
import pickle
import pptransport
import ppauto
import ppcommon

然後在與“pp.py”相同的根目錄“site-packages”資料夾裡找到“pptransport.py”,用編輯器開啟,把第171至第187行改為:

    def send(self, data):
        size = struct.pack("!Q", len(data))
        t_size = struct.calcsize("!Q")
        s_size = 0
        while s_size < t_size:
            p_size = self.socket.send(size[s_size:])
            if p_size == 0:
                raise RuntimeError("Socket connection is broken")
            s_size += p_size

        t_size = len(data)
        s_size = 0
        while s_size < t_size:
            p_size = self.socket.send(data[s_size:])
            if p_size == 0:
                raise RuntimeError("Socket connection is broken")
            s_size += p_size

好了,此時我們試試能不能正常匯入pp了
這裡寫圖片描述
可以了,大功告成!

感謝您的耐心閱讀與支援^_^

作者:Nick.ZLS(超可愛的小松鬆)
獵戶座分析團隊菜鳥級量化分析師

這裡寫圖片描述