如何在Python中同时使用COM和多处理?

问题描述:

我试图让两个进程,并让他们相互沟通。其中一个通过使用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_()     

任何人都可以给我一些建议吗?

您是否试图在您的侦听器和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