進(jìn)程池中父子進(jìn)程通信

項目中碰到了這樣的一個問題苛坚,我的意圖是實現(xiàn)pyside2中的進(jìn)度條實時跟進(jìn)項目進(jìn)度擦盾,為了防止主進(jìn)程也就是程序主窗口陷入阻塞狀態(tài),我需要額外再開一個線程出來并行處理問題:

#首先需要定義一個自定義線程類
# 循環(huán)監(jiān)視多進(jìn)程數(shù)目
def cycleMonitorThread(self):
    self.ongoing = True
    qlist = []
    # 使用無限循環(huán),不間斷的獲取隊列長度姨丈,以此更新進(jìn)度條進(jìn)度
    while True:
          # 獲取隊列內(nèi)數(shù)據(jù)的長度,不取出擅腰,就看長度
          qlist.append(self.qcount.get())
          print(qlist)
          so.process_update.emit(len(qlist))
          # 隊列的長度是絕對不會超過文件數(shù)量的蟋恬,所以一旦隊列長度等于了文件長度,就退出無限循環(huán)
          if len(qlist) == self.progressNum:
             self.ui.transformbtn.setText("轉(zhuǎn)換完成")
             self.ui.transformbtn.setEnabled(True)
             self.ongoing = False
             break

# 再在程序合適的地方插入執(zhí)行線程的語句
thread1 = threading.Thread(target=self.cycleMonitorThread)
thread1.start()

我原本以為在子進(jìn)程中只需要使用q = queue.Queue()就可以在主進(jìn)程和子進(jìn)程中進(jìn)行通信溝通趁冈。
以下插入項目的簡化代碼(我測試摸索問題在哪用的就是這個):

from queue import Queue
from threading import Thread


def foo(q):
    q.put('hello')
    return q.get()


def run(q):

    p = mp.Pool()
    p.apply_async(func=foo, args=(q,))
    p.close()
    p.join()



if __name__ == '__main__':
    q = Queue()
    thread = Thread(target=run, args=(q,))
    thread.start()

    print(q.get())

可是情況并沒有我想象的那么簡單歼争,各位可以復(fù)制以上代碼去運行,你們會發(fā)現(xiàn)q.get()并不會返回任何數(shù)據(jù)過來


經(jīng)過好幾天的思考渗勘,并結(jié)合多方查詢后明白了沐绒,在多進(jìn)程中,queue一般適用于子進(jìn)程間的通信旺坠,不能用于父子進(jìn)程中的通信乔遮。那么我實在是想實現(xiàn)父子之間的通信該怎么辦呢?

解決方法:
在父進(jìn)程中使用multiprocessing.Manage()中的Queue()方法取刃,然后將此對象實例化蹋肮,我這里用q表示出刷,并將q作為參數(shù)傳進(jìn)進(jìn)程方法中。具體代碼如下:

import multiprocessing
from threading import Thread


def foo(q):
    q.put('hello')


def run(q):

    p = multiprocessing.Pool()
    p.apply_async(func=foo, args=(q,))
    p.close()
    p.join()



if __name__ == '__main__':
    mg = multiprocessing.Manager()
    q = mg.Queue()
    thread = Thread(target=run, args=(q,))
    thread.start()

    print(q.get())

這次運行之后就能輸出hello了坯辩。


曉得了這個思路之后馁龟,剩下的就是將其帶入項目中進(jìn)行實現(xiàn)。最終我實現(xiàn)了進(jìn)度條實時根據(jù)項目進(jìn)度更新的目的漆魔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坷檩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子改抡,更是在濱河造成了極大的恐慌淌喻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雀摘,死亡現(xiàn)場離奇詭異裸删,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阵赠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門涯塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人清蚀,你說我怎么就攤上這事匕荸。” “怎么了枷邪?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵榛搔,是天一觀的道長。 經(jīng)常有香客問我东揣,道長践惑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任嘶卧,我火速辦了婚禮尔觉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芥吟。我一直安慰自己侦铜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布钟鸵。 她就那樣靜靜地躺著钉稍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棺耍。 梳的紋絲不亂的頭發(fā)上贡未,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼羞秤。 笑死,一個胖子當(dāng)著我的面吹牛左敌,可吹牛的內(nèi)容都是我干的瘾蛋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼矫限,長吁一口氣:“原來是場噩夢啊……” “哼哺哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叼风,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤取董,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后无宿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茵汰,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年孽鸡,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹂午。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡彬碱,死狀恐怖豆胸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巷疼,我是刑警寧澤晚胡,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站嚼沿,受9級特大地震影響估盘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骡尽,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一忿檩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爆阶,春花似錦燥透、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至故河,卻和暖如春吱韭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工理盆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留痘煤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓猿规,卻偏偏與公主長得像衷快,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姨俩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容