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

# 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. Ubuntu终端文件的压缩和解压缩命令

    在Ubntu的终端中压缩和解压缩是每天几乎要用到的命令,由于linux中各种压缩文件类型较多,所以需要记住几个主要的压缩和解压缩命令: 文件类型 执行动作 命令 .tar 解包 tar xvf Fil ...

  2. 第11课 enum、sizeof、typedef 分析

    1. enum枚举类型 1.1 使用方法 (1)enum是C语言中的一种自定义类型 (2)enum值是可以根据需要自定义的的整型值 (3)第一个定义的enum值默认为0. (4)默认情况下的enum值 ...

  3. RBF神经网络和BP神经网络的关系

    作者:李瞬生链接:https://www.zhihu.com/question/44328472/answer/128973724来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. Node.js 介绍及安装

    Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.本文详细介绍了No ...

  5. ajax json用法 上传文件 登录

     1. json  json  是一种数据结构  跨平台跨语言   1. python中json数据的转换   1.数据类型    字符串 数字 布尔值 列表 字典 None       2. 序列化 ...

  6. smfony设置量表之间的关系

    设置量表之间的关系 验证是否ok 查看我们定义是否有问题 数据库操作 http://www.2cto.com/database/201504/387197.html  设置时间段数据库自动插入时间 不 ...

  7. ASP.NET CMS: Administration Template

    ASP.NET CMS: Administration Template For many creating advanced ASP.NET website or application admin ...

  8. mysql 解除安全模式

    问题:rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE t ...

  9. jquery在元素中存储数据:data()

    转自:http://www.php.cn/js-tutorial-405445.html 在元素中存储数据:data() 1 2 3 4 5 6 7 8 9 10 <!DOCTYPE html& ...

  10. php iconv 函数

    原型: $txtContent = iconv("utf-8",'GBK',$txtContent); 特殊参数:iconv("UTF-8","GB2 ...