2014-04-01 62 views
3

我有我想與對方溝通兩個過程:屬性的子類

文件hwmgr.py:

import multiprocessing as mp 
from setproctitle import setproctitle 
import smbus 
import myLoggingModule as log 

class HWManager(mp.Process): 
    def __init__(self): 
     mp.Process.__init__(self) 
     self.i2c_lock = mp.Lock() 
    def run(self): 
     setproctitle('hwmgr') 
     # self.logger = log.config_logger(**kwargs) 
    def get_voltage(self): 
     with self.i2c_lock: 
      # ...do i2c stuff to get a voltage with smbus module 
     # self.logger.debug('Got a voltage: %s', voltage) 
     return voltage 

文件main.py:

import hwmgr 

hwm = hwmgr.HWManager() 
hwm.start() 

battery = hwm.get_voltage() 

print battery # Works! 

所以,有趣的是,這個按預期工作 - 電壓由方法調用返回,沒有任何特殊的多處理魔術。 不過,如果我使那些涉及到記錄器,遇到logger.debug()調用時兩條線,我得到:

AttributeError: 'HWManager' object has no attribute 'logger' 

而且,事實上,如果我打印dir(self),大約是這裏,這不是」沒有logger
我不明白嗎?我的記錄器去哪了?

記錄儀在run()方法定義的,而不是__init__()的原因是因爲我的新進程的根記錄後很,而且由於記錄的文件名是由新進程標題取(getproctitle())這不能被稱爲後才過程在__init__()方法完成分叉 - 有可能是另一種方式來做到這一點的一部分,當然,但我還沒有找到它...

在製品代碼:
我已刪除參考文獻e到日誌記錄模塊 - 屬性是什麼並不重要。
如果您註釋掉該行print houdiniAttribute,一切正常

只要是明確的,合格的返回INT工程 - 消失的屬性是關注

文件hwmgr.py:

import multiprocessing as mp 
from setproctitle import setproctitle 
import smbus 

class HWManager(mp.Process): 
    def __init__(self): 
     mp.Process.__init__(self) 
     self.i2c_lock = mp.Lock() 

    def run(self): 
     setproctitle('hwmgr') 
     self.houdiniAttribute = 'ASDFGHJKL' 
     with self.i2c_lock: 
      pass # Set up I2C bus to take ADC readings 

     while True: # Doesn't matter if this is here... 
      pass 

    def get_voltage(self): 
     with self.i2c_lock: 
      voltage = 12.0 # Actually, do i2c stuff to get a voltage with smbus module 
     print self.houdiniAttribute 
     return voltage 

文件client.py:

import multiprocessing as mp 
from setproctitle import setproctitle 
from time import sleep 

class HWClient(mp.Process): 
    def __init__(self, hwm): 
     mp.Process.__init__(self) 
     self.hwm = hwm 

    def run(self): 
     setproctitle('client') 
     while True: 
      battery = self.hwm.get_voltage() 
      print battery 
      sleep(5) 

文件main.py:

import hwmgr 
import client 

hwm = hwmgr.HWManager() 
hwm.start() 
cl = client.HWClient(hwm) 
cl.start() 
+0

要添加信息到您的問題,請點擊問題下的「編輯」鏈接,而不是發佈新問題並鏈接到原始問題。實際上,原來的問題可能會被視爲「太寬泛」,但如果將其與此嘗試解決方案結合使用(爲簡潔起見,我建議進行一些編輯),而不是我認爲值得的給予好評。 –

+0

[Python多處理設計建議]的可能重複(http://stackoverflow.com/questions/22774756/python-multiprocessing-design-suggestions) –

+0

此外,似乎run方法中添加的任何屬性消失,並且不再可用其他方法訪問。這是一個變量範圍的問題嗎? – BugSpray

回答

1

試圖澄清:

  1. 您在過程創建一個進程對象11
  2. 過程對象產生一個新處理(處理2)
  3. 在過程2中,run()稱爲在同一個類的另一個對象(對象2)上。
  4. run()受讓人屬性對象2
  5. 過程2完成並刪除對象2
  6. 方法1現在知道過程2已完成。對象1仍然具有舊的屬性。

如果你想同步的東西,看看經理。 Multiprocessing Share Unserializable Objects Between Processes

這是回答您的問題嗎?

+0

即使我在'self.logger = log ...'行之後添加了'while True:pass'(即HWManager從不「結束」),對記錄器的引用仍然不起作用 - 但其方法的引用工作得很好。我可以在沒有任何戲劇的情況下從main.py中調用它們。這不是一個關於序列化或同步的問題 - HWManager是一個類/進程,它是衆多類中的一個,它們都來自原始腳本文件。我爲其他產生的進程調用硬件管理器上的方法獲得返回值的方式。 – BugSpray

+0

你讀過鏈接的問題和提到的問題嗎?它可能有幫助。直到現在我確實看到你的問題等於http://stackoverflow.com/questions/19468885/how-to-properly-set-up-multiprocessing-proxy-objects-for-objects-that-already-ex – User

+0

鏈接如果我理解正確,就會問到如何在進程之間同步對象。我在進程之間移動數據沒有任何問題 - 嘗試運行上面的WIP代碼,並註釋掉print houdiniAttribute這一行 - 工作正常。我不明白的是,當該行被啓用時,該屬性會去哪裏。 – BugSpray