2016-01-22 90 views
1

編輯:我解決了它!不要犯同樣的錯誤和我Python多處理更多無限循環在同一時間

替換此行:

p = multiprocessing.Process(target=check(mval,mname)) 

有:

p = multiprocessing.Process(target=check, args=(mval,mname)) 

--------------- -------------------------------------------------- ----------------------

我正在製作一個帶有樹莓派和一些微動開關的機器人,我想檢查微動開關,如果它們被觸發,所以我使用多處理模塊,過程類與幾個無限循環和問題是完全一致的是一個人開始並等待,直到它被觸發,並結束並開始下一個,而不是所有人都獨立開始和運行。這是我的代碼到目前爲止。

import multiprocessing 
import time 
import RPi.GPIO as GPIO 

GPIO.setmode(GPIO.BOARD) 
GPIO.setwarnings(False) 

GPIO.setup(32, GPIO.IN, pull_up_down = GPIO.PUD_UP) 
GPIO.setup(7, GPIO.IN, pull_up_down = GPIO.PUD_UP) 
GPIO.setup(12, GPIO.IN, pull_up_down = GPIO.PUD_UP) 
GPIO.setup(36, GPIO.IN, pull_up_down = GPIO.PUD_UP) 

def check(mval, mname): 
    while True: 
     time.sleep(0.01) 
     check = GPIO.input(mval) 
     if check == False: 
      print("triggered " + mname) 
      with open("tmp.txt", "w"): 
       pass 
      f = open("tmp.txt", "w") 
      f.write(mname) 
      f.close() 
      break 

def startcheck(mval, mname): 
    p = multiprocessing.Process(target=check(mval,mname)) 
    p.start() 
    p.join() 


startcheck(32, "m1") 
startcheck(7, "m2") 
startcheck(12, "m3") 
startcheck(36, "m4") 

回答

1

join()函數會導致每個循環在下一個循環開始之前終止。從標準庫文檔:

「join([timeout]) 如果可選參數timeout爲None(缺省值),則該方法將阻塞,直到調用join()方法的進程終止。號,它會阻止最多超時秒。

一種方法可以連接很多次。

進程不能加入本身,因爲這會引起死鎖。這是一個錯誤嘗試加入過程中它具有前已經開始。「

解決方法:刪除join()行。

+0

感謝您的回答,我刪除了join()行,但問題仍然存在。它仍然一次執行一個,而不是同時執行一個。 –

+0

PI實際上是否支持多個進程?通常我認爲Python中的「Process」代表在多核CPU的另一個核心上執行的線程。我可能是錯的。請參閱multiprocessing.cpu_count()的文檔。該函數返回的值可能提供線索。 –

+0

它返回4,我已經更多地查看支持多個進程的Pi,並且找到了一個運行完好的示例代碼[link](https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=129358)所以問題必須在別處。 –