簡體   English   中英

Python3多處理“ for”循環

[英]Python3 multiprocessing a 'for' loop

我真的很想問這個問題,因為即使我閱讀了文檔並看到了一些示例也無法真正理解如何使用它。

我有一個Raspberry pi 3模型B,我交叉編譯了QT 5.6和最新的SIP和PyQt5版本來開發Python GUI和使用linux幀緩沖區,直到我運行了這部分代碼,一切都成功了。

def refresh_data(self):
        if self.setTarget == 1:
            for x in range(0, self.targetnum):
                self.target.append(getShadowInfo(x))
                if float(self.target[x]) != self.datalist[x]:
                    if float(self.target[x]) > self.datalist[x]:
                        self.step.append(float(self.target[x]) - self.datalist[x])
                        self.negative.append(0)
                    else:
                        self.step.append(self.datalist[x] - float(self.target[x]))
                        self.negative.append(1)
                else:
                    self.step.append(0)
                    self.negative.append(0)
                self.step[x] *= 0.1
            self.setTarget = 0
            self.setTodaysDate(self.year, self.month, self.day, self.hour, self.min)
        self.stopv += 10
        for x in range(0, self.targetnum):
            if self.step[x] != 0:
                if self.negative[x] == 0:
                    self.datalist[x] += self.step[x]
                else:
                    self.datalist[x] -= self.step[x]
                self.setCustomParameter(x)
        if all(i == 0 for i in self.step):
            self.timer.stop()
        if self.stopv >= 100:
            self.timer.stop()

它從外部文件讀取數據並將其設置為目標,然后增加或減少實際值以在python GUI上進行更新,這樣看起來就很平滑,但是同時發生的是,性能變差並且甚至執行了代碼比預期的慢(由50ms Qtimer運行)。 使用htop時,我注意到在運行這部分代碼時,我的RPi僅使用其四個內核中的一個,有人可以幫助我對兩個for循環進行多處理嗎?或者,也許更好的是refresh_data函數?

編輯!

setCustomParameter函數

def setCustomParameter(self, intparameter):
        if intparameter == 1:
            #RPMMeter
            self.hygrometer.setProperty("gaugeValue", round(self.datalist[1], 2))
            self.label_5.setText(QCoreApplication.translate("MainWindow", "Engine Speed: " +
            str(round(self.datalist[1], 2)) + " RPM"))
        if intparameter == 2:
            #Pressure
            self.label.setText(QCoreApplication.translate("MainWindow",
            str(round(self.datalist[2], 2)) + " KPa"))
            self.progressBar.setProperty("value", self.datalist[2])
        if intparameter == 3:
            self.thermometer.setProperty("thermoValue", round(self.datalist[3], 2))
        if intparameter == 4:
            self.KW_Meter.setProperty("gaugeValue", round(self.datalist[4], 2))
        if intparameter == 5:
            self.Battery_bank_label.setText(QCoreApplication.translate("MainWindow",
            "Battery Bank Voltage: " + str(round(self.datalist[5], 2)) + "V (MEDIUM)"))

它看起來像你也許可以通過減少3倍的速度(兩個回路,1 all這也是一個for循環)為1,循環與if語句的一些巧妙的布局。

通過壓縮目標數據列表。 假設self.target,self.negative,self.datalist和self.step的長度相同。

for i, (t, d) in enumerate(zip(self.target, self.datalist)):
    t = float(t)
    if (t != d) and (t > d) and (self.setTarget == 1):
        self.target.append(getShadowInfo(x))
        self.datalist = d + (t - d) * .1
    elif (t != d) and (t <= d) and (self.setTarget == 1):
        self.target.append(getShadowInfo(x))
        self.datalist = d - (d - t) * .1
    else:
        self.setCustomParameter(i)

if self.setTarget == 1
    self.setTarget = 0
    self.setTodaysDate(self.year, self.month, self.day, self.hour, self.min)

如果您能夠弄清楚如何將for循環減少到1,則可以通過從multiprocessing.pool.Pool返回索引和數據來完全替換for循環來對其進行multiprocessing.pool.Pool

# replacing ... self.datalist = d - (d - t) * .1
# with ... return i, d - (d - t) * .1
results = mp.Pool(4).starmap(return_data, zip(self.target, self.datalist))
for i, d in results:
    self.datalist[i] = d

注意:訣竅將是弄清楚如何處理需要更新的內容而self.target在for循環中self.target

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM