脚本宝典收集整理的这篇文章主要介绍了python3 进程间通信之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套接字
用例子理解:
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())
结果:
1
2
3
4
|
<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 你好啊 |
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))
结果:
1
2
3
4
5
6
|
父进程 父进程 - <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())
1
2
3
|
父进程 子进程 父进程收到: 发给对方父进程 |
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()
1
2
3
4
|
<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()
1
2
3
4
5
6
|
<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 |
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()
1
2
|
socket1 send to socket2 hello test2 recv hello |
以上是脚本宝典为你收集整理的python3 进程间通信之socket.socketpair()全部内容,希望文章能够帮你解决python3 进程间通信之socket.socketpair()所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。