global a
a = {}
class Control_system(QMainWindow, Ui_Control_system):
socketQueue = multiprocessing.Queue() # 连接队列
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.p1 = multiprocessing.Process(target=Control_system.connect, args=(self.socketQueue,))
self.p1.start()
self.timer = QTimer(self)
self.timer.timeout.connect(self.client) # 自动传入数据
self.timer.start(1000)
@staticmethod
def connect(queue):
ip_port = ("192.168.1.251", 8880)
s = socketserver.ThreadingTCPServer(ip_port, MyServer)
s.serve_forever()
def client(self):
print(a)
# 这里的a还是空值
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
print("conn is :", self.request) # conn
print("addr is :", self.client_address) # addr
a[self.client_address] = self.request
print("a:",a)
# 这里的a是有值的
if __name__ == '__main__':
if not QApplication.instance():
app = QApplication(sys.argv)
else:
app = QApplication.instance()
w = Control_system()
w.show()
sys.exit(app.exec())
在多进程程序中,每个进程都有自己的地址空间,全局变量也是每个进程独立维护的,因此在一个进程中将全局变量赋值后,在其他进程或线程中是看不到这个赋值的。在你的代码中,a
是一个全局变量,在MyServer
进程中对它进行了赋值操作,但在Control_system
进程中的client
函数中访问a
仍然是空值,因为它们处于不同的进程中。
如果你想让Control_system
进程中的client
函数也能访问到a
的赋值,有几种解决方案:
将a
存储到一个共享的内存中,比如使用multiprocessing.Manager
来创建一个共享的字典,让各个进程可以共享和访问。
在MyServer
进程中,将a
的值发送给Control_system
进程,比如通过进程间通信(IPC,如使用multiprocessing.Pipe
或multiprocessing.Queue
)或网络通信(如使用socket)等方式。
具体如何实现,可以根据实际情况选择合适的方法。