python: 多进程实例

1. 实例一

  • 主进程跟子进程的通过两个队列实现全双工通信;
  • 如有需要主进程会提示窗口输入信息传输给子进程;
  • 如果子进程收到主进程的消息,会弹窗提示收到的消息;
  • 子进程弹窗提示进程即将结束;
    在这里插入图片描述
  • 详细代码如下
# -*- coding: utf-8 -*-
# @Time    : 30/07/2024  09: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([True, False])
    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 = [
        [sg.Button('启动任务')],
        [sg.Text('', size=(30, 1), key='-OUTPUT-')]
    ]

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值