python3 进程间通信之socket.socketpair()

socket.socketpair()是什么鬼东西?

socket.socketpair()函数仅返回两个已经连接的套接字对象,参数和socket.socket()里的参数一样的用法。

 socket.socketpair()可以理解为 创建了两个socket, 比喻为一个server的 socket,一个client的socket,这两个socket是已经connected连接状态

 socket.socketpair()是全双工模式,也就是每个socket都能收发,比喻为server.send--->client.recv,和 client.send--->server.recv

 socket.socketpair()默认是创建unix套接字

用例子理解:

1.单个进程中的 socket.socketpair

a,b=socket.socketpair()
print(a)
print(b) a.send(b'hello')
brecv=b.recv(1024) print('b recv',brecv.decode()) b.send('你好啊'.encode()) arecv=a.recv(1024)
print('a recv',arecv.decode())

结果:

<socket.socket fd=4, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
<socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
b recv hello
a recv 你好啊

 

2.多个进程os.fork()中的 socket.socketpair

os.fork 参考url:https://www.cnblogs.com/lijinlei521/p/12699388.html

os.fork 就是克隆进程,在主进程中创建子进程,并复制主进程所有内存地址到子进程中,并一起执行fork之后的代码块,父子进程会返回不同的pid号 来区别是主进程(主进程返回子进程pid)还是子进程(子进程返回pid 号0)

import os
import socket socket1,socket2=socket.socketpair() pid=os.fork() if pid==0:
print('子进程')
print('子进程-',socket1,id(socket1))
print('子进程-',socket2,id(socket2)) else:
print('父进程')
print('父进程-',socket1,id(socket1))
print('父进程-',socket2,id(socket2))

结果:

父进程
父进程- <socket.socket fd=4, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0> 4334200680
父进程- <socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0> 4334200776
子进程
子进程- <socket.socket fd=4, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0> 4334200680
子进程- <socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0> 4334200776

 说明:

1.os.fork() 复制了主进程所有内存地址到子进程,所以 子进程和父进程现在都有两个一样(id结果一样)的socket   (socket1,socket2)

2.所以可以在各个进程中用一个,关掉另外一个没用的,只留个自己用的socket就行,另一个对方用

import os
import socket socket1,socket2=socket.socketpair() pid=os.fork() if pid==0:
print('子进程')
socket1.close()
socket2.send('发给对方父进程'.encode()) else:
print('父进程')
socket2.close()
recv=socket1.recv(1024)
print('父进程收到:',recv.decode())
父进程
子进程
父进程收到: 发给对方父进程

  

3.多进程multiprocessing中的 socket.socketpair   同 os.fork()原理

import socket
from multiprocessing import Process
socket1,socket2=socket.socketpair() def test():
print(socket1)
print(socket2) p1=Process(target=test)
p2=Process(target=test)
p1.start()
p2.start()
<socket.socket fd=4, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
<socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
<socket.socket fd=4, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
<socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>

  

import socket
from multiprocessing import Process
socket1,socket2=socket.socketpair() def test():
print(socket1)
print(socket2)
# socket2.close() #可以不close, 但是没有意义,除非在单个进程里 socket1 和socket2这两个自己和自己玩 一个发,一个接
print('socket1 send to socket2 hello')
socket1.send(b'hello') def test2():
print(socket1)
print(socket2)
# socket1.close()
recv=socket2.recv(1024)
print('test2 recv',recv.decode())
p1=Process(target=test)
p2=Process(target=test2)
p1.start()
p2.start()
<socket.socket fd=4, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
<socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
socket1 send to socket2 hello
<socket.socket fd=4, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
<socket.socket fd=5, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
test2 recv hello

 

4.多线程Thearding中的 socket.socketpair   同单个进程中的 socket.socketpair原理

1.多线程都是 在一个进程中执行,没有复制进程的概念,所以 只有一个socketpair  对,所以不能close 任何一个 socket, 如果关了,这个唯一的一对连接可就断了,就不能收发工作了

2.多进程这种可以close 是因为子进程复制又复制了一对socketpari()就像创建了快捷方式,删除一个就好像 删了快捷方式 ,文件还在,如果文件也删了就真的关闭了,没法通信了

import socket
from threading import Thread
socket1,socket2=socket.socketpair() def test(): print('socket1 send to socket2 hello')
socket1.send(b'hello') def test2(): recv=socket2.recv(1024)
print('test2 recv',recv.decode())
p1=Thread(target=test)
p2=Thread(target=test2)
p1.start()
p2.start()
socket1 send to socket2 hello
test2 recv hello

  

python3 进程间通信之socket.socketpair()的更多相关文章

  1. 进程间通信七 (socket)

    copyright:weishusheng          data:2015.5.26              摘要:socket又叫套接字或者插口,它也是进程间通信的一种方式,实际上就是网络上 ...

  2. 通信(二):进程间通信之socket

    一.为什么要学习socket? 我们打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?我们用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket.本地的进程间通 ...

  3. python3中的socket

    socket是什么?用它做什么? socket,我们通俗的称之为套接字, 是进程间通信的一种方式,但是他与其他进程通信的一个主要区别是 他能实现不同主机间的通信,比如我们现在用的浏览器,在比如我们使用 ...

  4. Python3的tcp socket接收不定长数据包接收到的数据不全。

    Python Socket API参考出处:http://blog.csdn.net/xiangpingli/article/details/47706707 使用socket.recv(pack_l ...

  5. Python3.6写socket程序

    Python进行Socket程序编写使用的主要模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象.套接字也有自己的方法集,这些方法可以实现基于套接字的网 ...

  6. 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...

  7. Android进程间通信之socket通信

    用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...

  8. [读书笔记]python3.5实现socket通讯(TCP)

    TCP连接: tcp是面向连接的一个协议,意味着,客户端和服务器开发发送数据之前,需要先握手创建一个TCP连接.TCP连接的一端与客户端套接字相互联系,另一端与服务器套接字相联系.当创建该TCP连接的 ...

  9. [读书笔记]python3.5实现socket通讯(UDP)

    UDP连接: 无连接,从一个端向另一端发送独立的数据分组 使用UDP连接的客户-服务器程序: UDPServer.py import socket serverPort = 50009 serverS ...

随机推荐

  1. linux svn切换用户

    1. 临时切换 在所有命令下强制加上--username 和--password选项. 例如:svn up --username zhangsan --password 123456 2.永久切换 删 ...

  2. File的功能--> 获取功能-->所有的根目录 | 创建文件功能,但是如果文件已经存在-->不再创建(新手)

    //导入的包.import java.io.File;import java.io.FileFilter;import java.io.IOException; // 获取功能-->所有的根目录 ...

  3. AspNetCore3.1_Secutiry源码解析_4_Authentication_JwtBear

    title: "AspNetCore3.1_Secutiry源码解析_4_Authentication_JwtBear" date: 2020-03-22T16:29:29+08: ...

  4. Servlet(简介,请求参数,页面跳转,生命周期,创建,配置,ServletContext,线程)

    1.Servlet简介 servlet是java servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序, 主要功能在于交互式浏览和修改数据,生成动态的web内容 服务端运行的 ...

  5. Web_jQuery

    第1章: jQuery简介 为了简化 JavaScript 的开发,一些 JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数,简化HTML与JavaScript之 ...

  6. 洛谷3372线段树模板题 对区间+k或者查询区间和

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  7. MySQL MyISAM和Innodb表生成序列

    目录 背景 分析 测试 结论 背景 应用端需要生成依次递增的序列来做流水序号等,方案有1.redis /MySQL SEQUENCE引擎生成序列:2.MySQL中myisam表 replace int ...

  8. Python第六章-函数04-递归函数和拉姆达表达式

    五.递归函数 什么叫递归(recusive)? 你拿两个镜子互相面对着, 然后去看镜子, 会发现每个镜子中很多个镜子, 层层的嵌套, 无穷尽, 这就是一种递归! 从前有坐山, 山里有座庙, 庙里有个老 ...

  9. 机器学习算法系列:FM分解机

    在线性回归中,是假设每个特征之间独立的,也即是线性回归模型是无法捕获特征之间的关系.为了捕捉特征之间的关系,便有了FM分解机的出现了.FM分解机是在线性回归的基础上加上了交叉特征,通过学习交叉特征的权 ...

  10. 解决GPU显存未释放问题

    前言 今早我想用多块GPU测试模型,于是就用了PyTorch里的torch.nn.parallel.DistributedDataParallel来支持用多块GPU的同时使用(下面简称其为Dist). ...