import multiprocessing import timedef worker(conn):# 从管道接收数据data = conn.recv()print(f'Worker received: {data}')# 修改字典(实际上不需要,只是为了演示)并发送回去data['modified'] = Truetime.sleep(10)conn.send(data)conn.close()if __name__ == '__main__':# 创建一个管道parent_conn, child_conn = multiprocessing.Pipe()# 创建一个字典data_to_send = {'key': 'value', 'number': 42}# 创建并启动子进程p = multiprocessing.Process(target=worker, args=(child_conn,))p.start()time.sleep(1)# 通过管道发送数据到子进程 parent_conn.send(data_to_send)time.sleep(1)# 从管道接收子进程发送回来的数据modified_data = parent_conn.recv()print(f'Main received: {modified_data}')# 关闭管道连接 parent_conn.close()# 等待子进程完成p.join()
使用 管道 在类和tkinter窗口间传递数据
import tkinter as tk from tkinter import messagebox import multiprocessing import time
class DataProcessor:def __init__(self, conn):self.conn = conndef run(self):while True:# 从管道接收数据data = self.conn.recv()if data is None: # 收到None作为退出信号break# 模拟数据处理processed_data = self._process_data(data)# 通过管道发送处理后的数据 self.conn.send(processed_data)def _process_data(self, data):# 这里简单地模拟数据处理,比如添加一个'processed'键data['processed'] = Truetime.sleep(2) # 模拟耗时操作return datadef main():# 创建管道parent_conn, child_conn = multiprocessing.Pipe()# 创建数据处理进程processor = DataProcessor(child_conn)p = multiprocessing.Process(target=processor.run)p.start()# 创建tkinter主窗口root = tk.Tk()root.title("Data Processor GUI")# 输入框和标签# 处理按钮def on_process():try:# 示例字典数据data = {"name": "Alice","age": 30,"city": "New York","hobbies": ["reading", "swimming", "traveling"]}# 发送数据到处理进程 parent_conn.send(data)# 接收处理后的数据processed_data = parent_conn.recv()messagebox.showinfo("Processed Data", str(processed_data))except Exception as e:messagebox.showerror("Error", f"Failed to process data: {e}")process_button = tk.Button(root, text="Process Data", command=on_process)process_button.pack()# 退出按钮(发送None作为退出信号给处理进程)def on_exit():parent_conn.send(None) # 发送退出信号(这里其实不会直接触发子进程的退出,但可以作为停止处理的标志) p.join() # 等待子进程实际退出(这里应该在子进程中处理退出逻辑) root.quit()exit_button = tk.Button(root, text="Exit", command=on_exit)exit_button.pack()# 运行tkinter主循环 root.mainloop()# 注意:实际上,为了让子进程能够正确退出,我们需要在子进程中添加对None的检查,并在收到None时退出循环。# 在上面的代码中,我们已经发送了None作为退出信号,但子进程中的退出逻辑是通过break语句在while循环中实现的。if __name__ == "__main__":main()