python: 多进程实例

打印 上一主题 下一主题

主题 577|帖子 577|积分 1731

1. 实例一



  • 主进程跟子进程的通过两个队列实现全双工通讯;
  • 如有需要主进程会提示窗口输入信息传输给子进程;
  • 假如子进程收到主进程的消息,会弹窗提示收到的消息;
  • 子进程弹窗提示进程即将结束;

  • 具体代码如下
  1. # -*- coding: utf-8 -*-
  2. # @Time    : 30/07/2024  09:58 AM
  3. # @FileName: main.py
  4. # @PythonVersion : (3, 7)
  5. import multiprocessing
  6. import random
  7. import threading
  8. import time
  9. import FreeSimpleGUI as sg
  10. def worker(num, main_queue, sub_queue, lock):
  11.     """子进程工作函数"""
  12.     x = None
  13.     time.sleep(1)  # 模拟长时间运行的任务
  14.     msg = random.choice([True, False])
  15.     if msg is True:
  16.         with lock:
  17.             message = f'进程 {num} 需要修改!'
  18.             sub_queue.put(message)
  19.             x = main_queue.get()
  20.     if x:
  21.         sg.popup(f"子进程{num}收到主进程发送过来的信息:{x}", keep_on_top=True)
  22.     sg.popup(f"子进程{num}进程已结束!", keep_on_top=True)
  23.     print(F"进程 {num} 执行完成!")
  24. def thread_worker(main_queue, sub_queue, lock, num_processes):
  25.     """子线程工作函数,启动进程池并管理管道"""
  26.     with multiprocessing.Pool(processes=num_processes) as pool:
  27.         # 启动子进程并将结果放入队列
  28.         pool.starmap(worker, [(i, main_queue, sub_queue, lock) for i in range(num_processes)])
  29.         pool.close()
  30.         pool.join()
  31.     sub_queue.put("任务都已执行完成!")
  32. def main():
  33.     layout = [
  34.         [sg.Button('启动任务')],
  35.         [sg.Text('', size=(30, 1), key='-OUTPUT-')]
  36.     ]
  37.     window = sg.Window('主窗口', layout)
  38.     # 使用 Manager.Queue 来跟踪子进程的结果
  39.     manager = multiprocessing.Manager()
  40.     lock = manager.Lock()
  41.     main_queue = manager.Queue()
  42.     sub_queue = manager.Queue()
  43.     while True:
  44.         event, values = window.read(timeout=100)
  45.         if event == sg.WIN_CLOSED:
  46.             break
  47.         if event == '启动任务':
  48.             # 启动子线程
  49.             threading.Thread(target=thread_worker, args=(main_queue, sub_queue, lock, 5), daemon=True).start()
  50.         # 处理来自进程的消息
  51.         while not sub_queue.empty():
  52.             message = sub_queue.get()
  53.             if not message == "任务都已执行完成!":
  54.                 window['-OUTPUT-'].update(message)
  55.                 main_queue.put(sg.popup_get_text(message + "主进程输入修改值"))
  56.             else:
  57.                 window['-OUTPUT-'].update(message)
  58.     window.close()
  59. if __name__ == "__main__":
  60.     main()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表