#先来看下如何实现多进程

# multiprocessing 这个是python的多进程的模块,我们会用到这个模块的很多方法
from multiprocessing import Process
import threading
import time def f(name):
time.sleep(2)
print("hello,",name) if __name__ == '__main__':
p1 = Process(target=f,args=("bob",))
p2 = Process(target=f, args=("aob",))
#多进程 # p1 = threading.Thread(target=f,args=("bob",))
# p2 = threading.Thread(target=f,args=("add",))
# 多线程
p1.start()
p2.start()
p1.join() 

进程和进程之间是不能共享数据的,比如我们看下面的例子

import multiprocessing
from multiprocessing import Queue
def test_func():
test_queue.put("aa") if __name__ == '__main__':
test_queue = Queue()
test_func()
print(test_queue.get())

  

结果如下

aa

  

我们在看一个例子,通过子进程去运行函数test_func()

import multiprocessing
from multiprocessing import Queue
def test_func():
test_queue.put("aa") if __name__ == '__main__':
test_queue = Queue()
p = multiprocessing.Process(target=test_func)
p.start()
# test_func()
# print(test_queue.get())

  

下面我们来讲解下

第一个例子,我们从头到尾只有一个进程在执行,所以在函数test_func中,可以直接使用外面定义的变量队列

第二个例子,我们通过子进程去启动函数test_func,由于子进程和自己的父进程不是同一个进程,所以,在test_func中不能直接使用变量队列,运行脚本会直接报错的,此时我们如想在子线程中使用变量队列,就只能通过函数传参的方式将队列传递进去,就比如下面的例子

import multiprocessing
from multiprocessing import Queue
def test_func(test_queue):
test_queue.put("aa") if __name__ == '__main__':
test_queue = Queue()
p = multiprocessing.Process(target=test_func,args=(test_queue,))
p.start()
print(test_queue.get())

  

#在看来子进程和父进程

from multiprocessing import Process
import os def info(title):
print(title)
print("module name,",__name__)
print("parent process,",os.getppid())
print("process id,",os.getpid())
print("\n\n") def f(name):
info("function f")
print("hello,",name) if __name__ == '__main__':
info("main process line")
#在主线程中调用info这个函数,所有这里执行的infor的函数的父进程是pycharm,而子进程id就是执行这个脚本的进程本身的id p = Process(target=info,args=("bob",))
#这里是在多线程中调用info这个函数,调用info这个函数,那么在这里执行info这个函数,打印的父进程就是脚本本身这个进程id,而
#这里的info函数的id就是一个新的进程id p.start()
p.join() '''
程序的执行结果如下
main process line
module name, __main__
parent process, 3132
process id, 9180 bob
module name, __mp_main__
parent process, 9180
process id, 5204 '''

 

#然后来看下通过Queue来实现进程之间数据交互

#不同进程之间的内存数据是不共享的,可以用下面的方法实现进程间的内存共享,要通过一个第三方才能通信,这里我们介绍第一个方法:用队列Queue来实现
#Queue有2个方法,一个put,一个是get,队列一定是先进先出
from multiprocessing import Process
from multiprocessing import Queue def f(q):
q.put({"k1": "v1"})
q.put(["1","2","3"])
q.put(["2", "2", "2"]) print(q.qsize())
#获取队列queue的大小 if __name__ == '__main__':
que = Queue()
que.qsize()
p = Process(target=f,args=(que,))
#这里执行这个函数,就是在执行这个脚本的进程id的子进程id
p.start()
print("from parent,",que.get())
print("from parent,", que.get())
#这里的进程id就是执行这个脚本的进程id
#这里要注意,que.get如果拿不到数据,则会一直阻塞
p.join() # 结果如下
'''
2
from parent, {'k1': 'v1'}
from parent, ['1', '2', '3 '''

#通过pipe来实现进程之间交互

#前面我们学习了进程之间交互数据的方法Queue,今天我们在来学习一下管道来实现进程之间的内存交互
# pipe管道,也是进程间通讯的一种方式,会返回一对对象,2个对象分别是管道的两头,一个管道是有2头,一头赋值给子进程,一头赋值给你父进程
from multiprocessing import Process
#导入多进程这个方法 from multiprocessing import Pipe
#导入管道这个方法 def f(conn):
conn.send(["a","b","c"])
conn.send(["1", "2", "3"])
conn.close()
#在子进程里send一个数据,然后关闭管道 if __name__ == '__main__':
parent_conn,child_conn = Pipe()
#生成一个管道,一端是父进程,一端是子进程
p = Process(target=f,args=(child_conn,))
#用子进程启动函数f,f这个函数就往管道里send数据
p.start()
#启动上面定义的子进程
print(parent_conn.recv())
#通过父进程去管道中获取数据,并打印
print(parent_conn.recv())
# parent_conn.recv()
# 这个recv这个方法也是阻塞的,如果没有recv到数据,则该管道会一直阻塞
p.join()
#等待这子进程执行完毕在退出

  

判断pipe的缓冲区是否还有数据poll(timeout=xxx)方法

import multiprocessing

def test(conn):

    conn.send("123")
conn.send("456")
conn.close()
print(conn.writable) if __name__ == '__main__':
p_conn,c_conn = multiprocessing.Pipe() p = multiprocessing.Process(target=test,args=[c_conn,])
p.start() # print(dir(p_conn))
print(p_conn.recv())
print(p_conn.recv())
if not p_conn.poll(timeout=2):
print("kong.....")
p.join()

python的进程间的数据交互的更多相关文章

  1. linux 共享内存shm_open实现进程间大数据交互

    linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #includ ...

  2. python 进程间共享数据 (二)

    Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  3. Python multiprocessing.Manager介绍和实例(进程间共享数据)

    Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

  4. Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程

    Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程 一丶获取进程以及父进程的pid 含义:    进程在内存中开启多个,操作系统如何区分这些进程, ...

  5. Python多进程-进程间数据的传递

    两个进程间的数据是独立的,要进行数据传递的话可通过几个方法 Queue 通过队列来进行进程间数据的传递 # -*- coding:utf-8 -*- __author__ = "MuT6 S ...

  6. 进程间共享数据Manager

    一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...

  7. View与Control间的数据交互

    View与Control间的数据交互 1.ViewBag.Name ="Name1" 2.ViewData["VD"] = "view data&qu ...

  8. C#中使用SendMessage在进程间传递数据的实例

    原文:C#中使用SendMessage在进程间传递数据的实例 1 新建解决方案SendMessageExample 在解决方案下面新建三个项目:CopyDataStruct,Receiver和Send ...

  9. 【转】VC 利用DLL共享区间在进程间共享数据及进程间广播消息

    1.http://blog.csdn.net/morewindows/article/details/6702342 在进程间共享数据有很多种方法,剪贴板,映射文件等都可以实现,这里介绍用DLL的共享 ...

随机推荐

  1. 1111 Online Map (30 分)

    1111 Online Map (30 分) Input our current position and a destination, an online map can recommend sev ...

  2. 1076 Forwards on Weibo (30 分)

    1076 Forwards on Weibo (30 分) Weibo is known as the Chinese version of Twitter. One user on Weibo ma ...

  3. 服务端tomcat的简单监控

    由于线上对tomcat监控处于失控的状态(只能通过跳转,简单地jstack/jstat进行监控),故需要针对tomcat快速查看其运行状态   Tomcat-manager   在tomcat/web ...

  4. unity3d动态加载dll的API以及限制

    Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Androi ...

  5. ioncube 加密软件 linux 使用方法

    https://www.ioncube.com/sa_encoder.php?page=pricing 购买成功后 解压文件包 装了一个linux 版的加密软件 目录:/webdata/soft/io ...

  6. PL/SQL 的一些用法

    变量的声明,赋值,打印(declare是pl/sql里面的用法 variable是sql*plus里面的用法,variable相当于一个sql*plus环境的全局变量,declare里定义的是pl/s ...

  7. 关于生成器---(yield)

    生成器:是自定义的迭代器(自己用python代码写的迭代器),函数中见到yield的就是生成器 那么yield前后的变量又该怎么理解 看例子一 def counter(name): print('%s ...

  8. 5. jdk路径配置

    path , classpath 的配置及作用? 1) PATH环境变量.作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到 ...

  9. angular 中怎么获取路径上的参数 参考:https://docs.angularjs.org/api/ng/service/$location

    参考: https://docs.angularjs.org/api/ng/service/$location

  10. SpringMVC 之@RequestBody 接收Json数组对象

    1. 摘要 程序流程: 前台使用ajax技术,传递json字符串到后台: 后台使用Spring MVC注解@RequestBody 接受前台传递的json字符串,并返回新的json字符串到前台: 前台 ...