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

  

最新文章

  1. Linux同平台数据库整体物理迁移
  2. Android first---放置在外存中的文件读取
  3. matlab生成HEX文件-任意信号 大于64K长度
  4. docker nexus oss
  5. I.MX6 WIFI wireless_tools 移植
  6. java进程状态
  7. 常用px,pt,em换算表
  8. Jquery Ajax的时候 老是返回到 error,是因为json格式不正规的原因
  9. uva 10963 - The Swallowing Ground
  10. 学习RAC小记-适合给新手看的RAC用法总结(转)
  11. ThinkPHP - 进行继承时的 构造函数
  12. display: inline-block兼容性写法
  13. TensorFlow LSTM 注意力机制图解
  14. centos下 redmind2.6安装
  15. SQL-42 删除emp_no重复的记录,只保留最小的id对应的记录
  16. CF1043
  17. GENIA语料库学习【转载】
  18. ROS知识(20)----SLAM资源集合
  19. 【进阶修炼】&mdash;&mdash;改善C#程序质量(7)
  20. 电商类Web原型制作分享-IKEA

热门文章

  1. table 上下左右 4根线的写法 :before :after 他们就能把td里面右下的那颗线给盖上 还有body和header横向滚动的联动 || 不能把body套在header上是为了上header表头固定 || 还有表头header的右侧overflow-y 是否出现滚动条的位置 记得有一个$nextTick 要不然会获取不到高度 高度就为0了 || 横向滚动条纵向滚动条
  2. 搭建XSS测试平台
  3. Selenium系列(二) - 控制浏览器操作的详细解读
  4. c++动态内存知识总结与疑问
  5. xpath模块使用
  6. elasticsearch实战(1)-单机快速部署
  7. Java基础语法(3)-运算符
  8. 什么是DevOps ?
  9. Qt 的信号与槽(纯干货)
  10. mongodb_2