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. npm和yarn使用

    npm和yarn使用 他们都属于js包管理工具,都可以安装包或者模块yarn 是由facebook.google等联合开发推出的 区别: npm 下载包的话 比如npm install,它是按照包的排 ...

  2. django中的缓存以及跨域

    django中的缓存 先来了解以下问题

  3. eNSP 交换机 路由器 PC 互连设计/实现

    0.实验目的 1.掌握网络设计的原理与步骤: 2.掌握IP分配.网关设置原则: 3.了解路由协议的作用,掌握网络互联设备的作用和配置. 1.实验环境 环境:eNSP模拟器 版本信息:1.3.00.10 ...

  4. web----HTML(WEB概述)

    ## web概述: *JavaWeb: 什么是web,即JavaWeb(使用Java语言开发基于互联网的项目). *软件架构: 1.C/S:Client/Server 客户端/服务器端 *在用户本地有 ...

  5. [模拟] Codefroces 1175B Catch Overflow!

    题目:http://codeforces.com/contest/1175/problem/B B. Catch Overflow! time limit per test 1 second memo ...

  6. AQS机制

    一,Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁).在Lock接口出现之前,Java ...

  7. Java 添加、删除Excel表单控件

    通过表单控件,用户可以快速地将数据填写到模板文档中,轻松引用单元格数据并与其进行交互.本文通过Java代码示例介绍如何在Excel表格中添加表单控件,包括文本框.单选按钮.复选框.组合框.微调按钮等: ...

  8. 调试 node.js 程序

    调试 node.js 程序 在程序开发中,如何快速的查找定位问题是一项非常重要的基本功.在实际开发过程中,或多或少都会遇到程序出现问题导致无法正常运行的情况,因此,调试代码就变成了一项无法避免的工作. ...

  9. ElasticSearch 倒排索引

    倒排索引 倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况. 由于每个字或词对应的文档 ...

  10. 一次作业过程及其问题的记录:mysql建立数据库、建表、查询和插入等

    前言 这次的作业需要我建立一个小的数据库. 这次作业我使用了mysql,进行了建库.建表.查询.插入等操作. 以下是对本次作业相关的mysql操作过程及过程中出现的问题的记录. 正文 作业中对数据库的 ...