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

# 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. 页面引用jquery中文变乱码的问题

    <script type="text/javascript" src="Js/JavaScript.js"></script>   方法 ...

  2. H3C的DHCP中继配置命令

    dhcp enable命令用来使能DHCP服务 dhcp relay information enable 命令用来配置DHCP中继支持Option 82功能 缺省情况下,DHCP中继不支持Optio ...

  3. [UE4]蓝图Get Control Rotation获取人物角色朝向,设置默认人物相机,朝向与controller绑定

    具体应用:控制人物移动方向 也可以使用“CombineRotators”将角色控制器Z轴旋转90°,然后再取正面方向,达到跟“Get Right Vector”一样的效果: 设置关联人物朝向使用控制器 ...

  4. golang web框架 beego 学习 (三) beego获取参数

    直接上常用的例子吧: A:     获取URL中的参数 router func init() { beego.Router("/task/?:id/?:name", &co ...

  5. securecrt8注册码

    securecrt8注册码,两个可用 Name:meisiCompany:TEAM ZWTSerial Number:03-14-367662License Key:ACCFAX R9FHJ7 QZV ...

  6. CSS 3 学习笔记

    css 3 学习笔记 文本: word-wrap : normal | break-word取值:normal:    控制连续文本换行.break-word:    内容将在边界内换行.如果需要,词 ...

  7. DOM事件机制(事件捕获和事件冒泡和事件委托)

    内容: 1.事件复习 2.事件冒泡与事件捕获 3.事件委托 1.事件复习 (1)事件 事件是用来处理响应的一个机制,这个响应可以来自于用户(点击, 鼠标移动, 滚动), 也可以来自于浏览器 下面的链接 ...

  8. spring securiry Xml 配置 登陆

    参考:https://blog.csdn.net/yin380697242/article/details/51893397 https://blog.csdn.net/lee353086/artic ...

  9. SqlServer——触发器

    一:触发器基本知识  1.首先必须明确以下几点: 触发器是一种特殊的存储过程,但没有接口(输入输出参数),在用户执行Inserted.Update.Deleted 等操作时被自动触发: 当触发的SQL ...

  10. Laravel之Eloquent ORM

    一.ORM编程思想 1.1 Active Record 设计模式 Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射.应用Active Reco ...