weixin_40005331 2019-10-09 02:21 采纳率: 0%
浏览 169

为什么全局变量在进程中赋值后,线程中接收不到。

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())

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 05:21
    关注

    在多进程程序中,每个进程都有自己的地址空间,全局变量也是每个进程独立维护的,因此在一个进程中将全局变量赋值后,在其他进程或线程中是看不到这个赋值的。在你的代码中,a是一个全局变量,在MyServer进程中对它进行了赋值操作,但在Control_system进程中的client函数中访问a仍然是空值,因为它们处于不同的进程中。

    如果你想让Control_system进程中的client函数也能访问到a的赋值,有几种解决方案:

    1. a存储到一个共享的内存中,比如使用multiprocessing.Manager来创建一个共享的字典,让各个进程可以共享和访问。

    2. MyServer进程中,将a的值发送给Control_system进程,比如通过进程间通信(IPC,如使用multiprocessing.Pipemultiprocessing.Queue)或网络通信(如使用socket)等方式。

    具体如何实现,可以根据实际情况选择合适的方法。

    评论

报告相同问题?

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题