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())

结果:

b recv hello

a recv 你好啊

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

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

importosimportsocket

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))

结果:

父进程

父进程- 4334200680

父进程- 4334200776

子进程

子进程- 4334200680

子进程- 4334200776

说明:

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

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

importosimportsocket

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()原理

importsocketfrom multiprocessing importProcess

socket1,socket2=socket.socketpair()deftest():print(socket1)print(socket2)

p1=Process(target=test)

p2=Process(target=test)

p1.start()

p2.start()

importsocketfrom multiprocessing importProcess

socket1,socket2=socket.socketpair()deftest():print(socket1)print(socket2)#socket2.close() #可以不close, 但是没有意义,除非在单个进程里 socket1 和socket2这两个自己和自己玩 一个发,一个接

print('socket1 send to socket2 hello')

socket1.send(b'hello')deftest2():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()

socket1 send to socket2 hello

test2 recv hello

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

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

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

importsocketfrom threading importThread

socket1,socket2=socket.socketpair()deftest():print('socket1 send to socket2 hello')

socket1.send(b'hello')deftest2():

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

python进程socket通信_python3 进程间通信之socket.socketpair()相关推荐

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

    python3 进程间通信之socket.socketpair() socket.socketpair()是什么鬼东西? socket.socketpair()函数仅返回两个已经连接的套接字对象,参数 ...

  2. linux socket通信组件,Linux下socket简单通信

    #define MAXLINE 4096 /**************程序流程******************* 1 用socket()函数创建一个socket 2 用bind()绑定到一个本地 ...

  3. linux进程socket通信,linux进程间通信--socket套接字 实例代码

    可以实现通信的代码实现,拿去用! 原文来自:http://blog.chinaunix.net/uid-26790551-id-3171897.html 服务器端: #include #include ...

  4. 解决socket通信时TIME_WAIT的socket过多

    TIME_WAIT状态 TCP要保证在所有可能的情况下使得所有的数据都能够正确被投递. 当关闭一个 socket 连接时,主动关闭一端的 socket 将进入TIME_WAIT状态,而被动关闭一方则转 ...

  5. python进程共享内存_Python进程间通信之共享内存

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...

  6. python socket编程之双方相互通信简单实例_Python socket实现的简单通信功能示例

    套接字(socket)是计算机网络数据结构,在任何类型的通信开始之前,网络应用程序必须创建套接字,可以将其比作电话的插孔,没有它将无法进行通信 常用的地址家族 AF_UNIX:基于文件,实现同一主机不 ...

  7. C#和Python的Socket通信

    目录 1.项目说明 2.Socket通信 2.1C#实现socket通信 2.2python实现socket通信 3.结果 3.1C#socket通信结果 3.2python和C# socket通信结 ...

  8. 路由Zebra 之socket通信机制

    1 socket通信过程 1.1 socket接收端流程 图1  socket server端函数关系   图2  socket server端通信流程图 Socketserver端的数据处理是由ma ...

  9. protobuf和socket通信简单实例

    protobuf和socket通信简单实例   protobuf是 Google 公司内部的混合语言数据标准,可以用来定义通信的协议,由于其有序列化和反序列化的操作,减小了存储或通信的数据量,从而达到 ...

最新文章

  1. Python要了解哪些编程基础 如何学Python比较好
  2. 2020人工神经网络第一次作业-参考答案第五部分
  3. RabbitMQ 消费端限流、TTL、死信队列
  4. 调整Kali Linux的锁屏时间
  5. RocketMQ的存储之消息的同步、异步刷盘
  6. finfoopen需要什么扩展 php_php获取文件mime类型的四种方法
  7. [转载]答《漫话ID》中的疑问:UniqueID和ClientID的来源
  8. python调用opencv代码_Python调用OpenCV实现图像平滑代码实例
  9. C语言-----职工信息管理系统
  10. 使用fdisk给新增加硬盘分区
  11. 互联网公司的技术体系
  12. dsp2812 寄存器总线
  13. PX4 git submodule时:Failed to recurse into submodule path 'src/modules/uavcan/libuavcan
  14. 《论个人在历史上的作用》总结反思
  15. php 对账单系统,微信支付开发对账单
  16. js如何打开本地html文件,html、js获取本地文件夹路径,打开本地应用程序
  17. 关于.net的一则笑话(无奈一笑)
  18. Freemarker模板---引擎学习
  19. Android - 一个似神器而非神器之Palette探索与实践
  20. yarn 命令学习:yarn application

热门文章

  1. jquery 对象 和 js 对象 为什么要互相转换?_JQuery对象与dom对象两者之间的相互转换...
  2. idea lombok插件安装_开发效率不高?墙裂推荐这十款精选 IntelliJ IDEA 插件
  3. mysql 5.622_新特新解读 | MySQL 8.0 对 count(*)的优化
  4. android判断密码字符串,逆向分析苏宁易购安卓客户端加密到解密获取明文密码(附demo验证) | WooYun...
  5. 安徽大学计算机科学与技术学院刘峰,刘峰
  6. 供应商主数据和客户主数据各个字段进行显示、必输、隐藏和可选输入的配置学习...
  7. 在JavaScript中实现命名空间 (转载)
  8. linux---編輯器
  9. 如何在没有导入excel的情况下获取excel中的测试数据
  10. r语言 四格画图_R绘图基础(一)