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())
为什么全局变量在进程中赋值后,线程中接收不到。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 憧憬blog 2023-03-15 05:21关注
在多进程程序中,每个进程都有自己的地址空间,全局变量也是每个进程独立维护的,因此在一个进程中将全局变量赋值后,在其他进程或线程中是看不到这个赋值的。在你的代码中,
a
是一个全局变量,在MyServer
进程中对它进行了赋值操作,但在Control_system
进程中的client
函数中访问a
仍然是空值,因为它们处于不同的进程中。如果你想让
Control_system
进程中的client
函数也能访问到a
的赋值,有几种解决方案:将
a
存储到一个共享的内存中,比如使用multiprocessing.Manager
来创建一个共享的字典,让各个进程可以共享和访问。在
MyServer
进程中,将a
的值发送给Control_system
进程,比如通过进程间通信(IPC,如使用multiprocessing.Pipe
或multiprocessing.Queue
)或网络通信(如使用socket)等方式。
具体如何实现,可以根据实际情况选择合适的方法。
解决 无用评论 打赏 举报
悬赏问题
- ¥30 求一段fortran代码用IVF编译运行的结果
- ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
- ¥15 lammps拉伸应力应变曲线分析
- ¥15 C++ 头文件/宏冲突问题解决
- ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
- ¥50 安卓adb backup备份子用户应用数据失败
- ¥20 有人能用聚类分析帮我分析一下文本内容嘛
- ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
- ¥30 python代码,帮调试,帮帮忙吧
- ¥15 #MATLAB仿真#车辆换道路径规划