J'essaye de faire deux processus et de les faire communiquer les uns aux autres. L'un d'entre eux obtient des valeurs via une bibliothèque COM en utilisant win32com, et l'autre obtient simplement les valeurs du premier processus via une file d'attente et les imprime. Je pense que le code ci-dessous n'a pas de problème, mais ça ne marche pas (le processus p2 n'affiche aucune valeur). Si je viens de faire les premières valeurs de file d'impression de processus dans le même processus parComment puis-je utiliser COM et le multitraitement en même temps en Python?
item = self.q.get()
print(item)
il montre des valeurs dans la file d'attente. Donc, je pense mettais des valeurs dans la file d'attente n'a pas de problème, et par conséquent, il pourrait y avoir des problèmes en matière d'échange de valeurs via le queue
, en utilisant 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_()
Quelqu'un pourrait-il me donner quelques conseils?
Merci pour la réponse. J'ai essayé de déclarer q comme ça, mais il n'y a pas de différence. Oui, je pense que peut-être ce fil (https://stackoverflow.com/questions/26764978/using-win32com-with-multithreading) a quelque chose à voir avec mon problème, mais je ne suis pas sûr que ce soit la même chose en utilisant le multitraitement et DispatchWithEvents. – maynull