python不同的进程之间进行通讯

使用管道进行通讯Pipe

import multiprocessing

def send_date(conn,data):
    conn.send("我发送消息了:{}".format(data));

def receive_date(conn):
    print("接受数据:{}".format(conn.recv()));

def main():
    conn_send,conn_recv = multiprocessing.Pipe();
    process_send = multiprocessing.Process(target=send_date,args=(conn_send,"奥利给"));
    process_receive = multiprocessing.Process(target=receive_date,args=(conn_recv,));
    process_send.start();
    process_receive.start();

if __name__ == '__main__':
    main();

进程队列Queue

import multiprocessing,time
def put_worker(queue):
    for item in range(50):
        time.sleep(1)
        print("生产数据:{},进程序列:{}".format(multiprocessing.current_process().name,item))
        queue.put("item = :{}".format(item));

def get_worker(queue):
    while True:
        try:
            print("消费数据:{},消费序列:{}".format(multiprocessing.current_process().name,queue.get(block = True,timeout = 2)));
        except:
            pass;

def main():
    queue = multiprocessing.Queue();
    producer_process = multiprocessing.Process(target=put_worker,name="生产者进程",args=(queue,));
    consumer_process = multiprocessing.Process(target=get_worker,name="消费者进程",args=(queue,));
    producer_process.start();
    consumer_process.start();
    producer_process.join()
    consumer_process.join()

if __name__ == '__main__':
    main();

subprocess

import subprocess

def main():
    # shell = True,允许执行shell程序
    subprocess.call("dir/a",shell=True);

if __name__ == '__main__':
    main();

import subprocess
'''
    args:要执行的shell命令,或者是命令的列表;
    bufsize:缓冲区大小;
    stdin,stdout,stderr:表示程序的标准输入,标准输出以及错误输出
    shell:是否直接执行命令,如果设置为True就表示可以直接执行:
    cwd:当前的工作目录;
    env:子进程环境变量;
'''
def main():
    # 调用Windows的系统命令启动了一个命令的子进程,而后由这个子进程实现了目录的创建
    subprocess.Popen("md yootk",shell=True,cwd="e:");

if __name__ == '__main__':
    main();

import subprocess,time

def main():
    # 运行记事本程序
    notepad_process = subprocess.Popen("notepad.exe");
    # 等待3秒之后关闭记事本
    time.sleep(3);
    # 销毁进程,记事本会被关闭
    notepad_process.kill();

if __name__ == '__main__':
    main();

import subprocess,time

def main():
    # 和命令交互
    open_process = subprocess.Popen("python.exe",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE);
    # 通过stdin实现命令的输入处理
    open_process.stdin.write("print('输出奥利给')\n".encode());
    open_process.stdin.write("name = '张三'\n".encode());
    open_process.stdin.write("print('{}-->在输出奥利给'.format(name))\n".encode());
    open_process.stdin.write("print(10+20)\n".encode());
    open_process.stdin.write("'No.' + 1\n".encode());
    open_process.stdin.close();
    cmd_out = open_process.stdout.read();
    open_process.stdout.close();
    cmd_error = open_process.stderr.read();
    open_process.stderr.close();
    print(cmd_out.decode());
    print("错误数据:"+cmd_error.decode());

if __name__ == '__main__':
    main();

manager

import multiprocessing
'''
    Manager类提供了list和map的数据传递的操作
    在多个进程之间可以同时操作一个list和map,是跨进程的存在
    跨进程的列表数据的保存操作梳理,实现了数据共享
'''
def worker(list,item):
    # 列表存储
    list.append("进入了进程处理函数 item = {},{}".format(multiprocessing.current_process().name,item));

def main():
    # 创建贡献数据
    manager = multiprocessing.Manager();
    main_item = "测试:{}".format(multiprocessing.current_process().name);
    # 根据序列创建列表
    manager_list = manager.list([main_item]);
    # 创建进程列表 另一种写法,遍历三次
    job_process = [multiprocessing.Process(target=worker,args=(manager_list,item,),name = "数据操作进程:{}".format(item)) for item in range(3)];
    # 启动列表中的所有进程
    for process in job_process:
        process.start();
    for process in job_process:
        process.join();

    print("所有进程执行完毕,列表最终数据为:{}".format(manager_list))
if __name__ == '__main__':
    main();
import multiprocessing
'''
    Manager类提供了list和map的数据传递的操作
    在多个进程之间可以同时操作一个list和map,是跨进程的存在
    跨进程的字典数据的保存操作梳理,实现了数据共享
'''
def worker(dict,item):
    # 列表存储
    dict.update({
    
    multiprocessing.current_process().name:item});

def main():
    # 创建贡献数据
    manager = multiprocessing.Manager();
    main_name = multiprocessing.current_process().name;
    main_value = "测试的value";
    # 根据序列创建列表
    manager_dict = manager.dict(main_name=main_value);
    # 创建进程列表 另一种写法,遍历三次
    job_process = [multiprocessing.Process(target=worker,args=(manager_dict,item,),name = "数据操作进程:{}".format(item)) for item in range(3)];
    # 启动列表中的所有进程
    for process in job_process:
        process.start();
    for process in job_process:
        process.join();

    print("所有进程执行完毕,列表最终数据为:{}".format(manager_dict))
if __name__ == '__main__':
    main();

猜你喜欢

转载自blog.csdn.net/weixin_44887276/article/details/114822776