2017-10-17 83 views
0

我試圖讓兩個進程,並讓他們相互溝通。其中一個通過使用win32com的COM庫獲取值,另一個通過隊列從第一個進程獲取值並打印出來。我認爲下面的代碼沒有問題,但它不起作用(p2過程根本不顯示值)。如果我只是在同一進程中使第一個進程的打印隊列值爲如何在Python中同時使用COM和多處理?

item = self.q.get() 
print(item) 

它顯示隊列中的值。所以,我認爲把值在隊列中已經沒有任何問題,因此,有可能是通過queue交換價值的一些問題,使用win32com

import win32com.client 
import os 
import multiprocessing as mp 
from PyQt4.QtGui import QApplication 
from datetime import datetime, timedelta 

global q 
q = mp.Queue()   # A queue is used to send values from p1 to p2               

class RealTrEventHandler(object):   
    def __init__(self): 
     self.q = q                

    def OnReceiveRealData(self,szTrCode): 
     date = datetime.utcnow() + timedelta(hours=3) 
     type = self.GetFieldData("OutBlock", "cgubun") 

     appending_line = date + ', ' + type 

     self.q.put(appending_line) 
     #item = self.q.get()      # it prints values out if these are not comments 
     #print(item) 

def ticker(): 
    loop = QApplication([]) 
    global instXASession, instXAReal 
    print('TICKER: ', os.getpid()) 

    # When an event occurs, it calls RealTrEventHandler class 
    instXAReal = win32com.client.DispatchWithEvents("XA_DataSet.XAReal", RealTrEventHandler) 
    instXAReal.LoadFromResFile("C:\\eBEST\\xingAPI\\Res\\OVC.res") 
    instXAReal.SetFieldData("InBlock", "symbol", "CLX17") 

    loop.exec_() 

class listener(mp.Process):   # What listener does is only to get values via the queue and prints them out 
    def __init__(self): 
     mp.Process.__init__(self) 
     self.q = q 

    def run(self): 
     print('CSM PID: ', os.getpid()) 
     while True: 
      item = self.q.get() 
      print(item) 

if __name__ == '__main__': 
    loop = QApplication([])  

    print('MAIN: ', os.getpid()) 
    p1 = mp.Process(target = ticker, args=()) 
    p1.start() 

    p2 = listener() 
    p2.start() 

    mp.freeze_support() 

    loop.exec_()     

任何人都可以給我一些建議嗎?

回答

1

您是否試圖在您的偵聽器和RealTrEventHandler類中顯式聲明q爲全局變量?例如: -

class listener(mp.Process): 
    global q 
    def __init__(self): 
     mp.Process.__init__(self) 
     self.q=q 

(至少)線程之間傳遞變量是使用buildins模塊的另一種方式,但我不知道,如果多那麼多的不同。

+0

謝謝你的回答。我試過像這樣宣佈q,但沒有區別。是的,我想也許這個線程(https://stackoverflow.com/questions/26764978/using-win32com-with-multithreading)與我的問題有關,但我不確定使用多處理時是否相同, DispatchWithEvents。 – maynull

相關問題