使用管道进行通讯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();