python3 进程间通信之socket.socketpair()
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()的更多相关文章
- 进程间通信七 (socket)
copyright:weishusheng data:2015.5.26 摘要:socket又叫套接字或者插口,它也是进程间通信的一种方式,实际上就是网络上 ...
- 通信(二):进程间通信之socket
一.为什么要学习socket? 我们打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?我们用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket.本地的进程间通 ...
- python3中的socket
socket是什么?用它做什么? socket,我们通俗的称之为套接字, 是进程间通信的一种方式,但是他与其他进程通信的一个主要区别是 他能实现不同主机间的通信,比如我们现在用的浏览器,在比如我们使用 ...
- Python3的tcp socket接收不定长数据包接收到的数据不全。
Python Socket API参考出处:http://blog.csdn.net/xiangpingli/article/details/47706707 使用socket.recv(pack_l ...
- Python3.6写socket程序
Python进行Socket程序编写使用的主要模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象.套接字也有自己的方法集,这些方法可以实现基于套接字的网 ...
- 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...
- Android进程间通信之socket通信
用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...
- [读书笔记]python3.5实现socket通讯(TCP)
TCP连接: tcp是面向连接的一个协议,意味着,客户端和服务器开发发送数据之前,需要先握手创建一个TCP连接.TCP连接的一端与客户端套接字相互联系,另一端与服务器套接字相联系.当创建该TCP连接的 ...
- [读书笔记]python3.5实现socket通讯(UDP)
UDP连接: 无连接,从一个端向另一端发送独立的数据分组 使用UDP连接的客户-服务器程序: UDPServer.py import socket serverPort = 50009 serverS ...
随机推荐
- Excel表格转Json数据结构
Excel表格转Json数据结构 辗转了好几个项目,每个项目的导表工具都巨难用,速度慢,潜规则多,扩展性差,不易于调试.Sqlite,Json,Lua,Xml各种格式都用过. 举个例子: 大多数导表工 ...
- JS实现滚动区域触底事件
效果 贴上效果展示: 实现思路 样式方面不多赘述,滚动区域是给固定高度,设置 overflow-y: auto 来实现. 接下来看看js方面的实现,其实也很简单,触发的条件是: 可视高度 + 滚动距离 ...
- 测试必知必会系列- Linux常用命令 - ps(重点)
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 查看所 ...
- SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
源码地址:GitHub·点这里||GitEE·点这里 一.基本简介 1.概念描述 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监 ...
- [Alg] 文本匹配-多模匹配-AC自动机
1. 简介 AC自动机是一种多模匹配的文本匹配算法. 如果采用naive的方法,即依次比较文本串s中是否包含模式串p1, p2,...非常耗时.考虑到这些模式串中可能具有相同子串,可以利用已经比较过的 ...
- ASP.NET MVC5实现芒果分销后台管理系统(二):Code First快速集成EntityFramework
在上一篇文章中,我们已经搭建了整个芒果后台管理系统整个工程架构,并集成了AutoMapper,日志组件等,接下来我们将使用Entity Framework完善系统的持久化存储部分.这篇EF的构造,我将 ...
- 150多个Flutter组件详细介绍送给你
迷茫是什么,迷茫就是大事干不了,小事不想干,能力配不上欲望,才华配不上梦想. 150+Flutter组件详细介绍地址:http://laomengit.com/ 前言 我在Flutter未正式发布之前 ...
- IE浏览器下载文件中文文件名乱码问题解决
处理过程 根据IE的F12中的log提示,是因为http头信息中的编码替换了html文件中的编码.我最初的思路是设置Tomcat默认编码,但是我发现我已经在Server.xml中设置过,想到这里我想到 ...
- Trie树-XOR-1695. Kanade的三重奏
2020-03-18 21:58:18 问题描述: 给你一个数组A [1..n],你需要计算多少三元组(i,j,k)满足(i <j <k)和((A [i] xor A [j])<(A ...
- python set() leetcode 签到820. 单词的压缩编码
题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...