鼠扑 发表于 2024-8-3 12:31:07

python: 多进程实例

1. 实例一



[*]主进程跟子进程的通过两个队列实现全双工通讯;
[*]如有需要主进程会提示窗口输入信息传输给子进程;
[*]假如子进程收到主进程的消息,会弹窗提示收到的消息;
[*]子进程弹窗提示进程即将结束;
https://i-blog.csdnimg.cn/direct/1e7cd14490734655919355f88ba87dec.gif
[*]具体代码如下
# -*- coding: utf-8 -*-
# @Time    : 30/07/202409:58 AM
# @FileName: main.py
# @PythonVersion : (3, 7)
import multiprocessing
import random
import threading
import time

import FreeSimpleGUI as sg


def worker(num, main_queue, sub_queue, lock):
    """子进程工作函数"""

    x = None
    time.sleep(1)# 模拟长时间运行的任务
    msg = random.choice()
    if msg is True:
      with lock:
            message = f'进程 {num} 需要修改!'
            sub_queue.put(message)
            x = main_queue.get()
    if x:
      sg.popup(f"子进程{num}收到主进程发送过来的信息:{x}", keep_on_top=True)
    sg.popup(f"子进程{num}进程已结束!", keep_on_top=True)
    print(F"进程 {num} 执行完成!")


def thread_worker(main_queue, sub_queue, lock, num_processes):
    """子线程工作函数,启动进程池并管理管道"""

    with multiprocessing.Pool(processes=num_processes) as pool:
      # 启动子进程并将结果放入队列
      pool.starmap(worker, [(i, main_queue, sub_queue, lock) for i in range(num_processes)])
      pool.close()
      pool.join()

    sub_queue.put("任务都已执行完成!")


def main():
    layout = [
      ,
      
    ]

    window = sg.Window('主窗口', layout)

    # 使用 Manager.Queue 来跟踪子进程的结果
    manager = multiprocessing.Manager()
    lock = manager.Lock()
    main_queue = manager.Queue()
    sub_queue = manager.Queue()

    while True:
      event, values = window.read(timeout=100)

      if event == sg.WIN_CLOSED:
            break

      if event == '启动任务':
            # 启动子线程
            threading.Thread(target=thread_worker, args=(main_queue, sub_queue, lock, 5), daemon=True).start()

      # 处理来自进程的消息
      while not sub_queue.empty():
            message = sub_queue.get()
            if not message == "任务都已执行完成!":
                window['-OUTPUT-'].update(message)
                main_queue.put(sg.popup_get_text(message + "主进程输入修改值"))
            else:
                window['-OUTPUT-'].update(message)

    window.close()


if __name__ == "__main__":
    main()



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: python: 多进程实例