python3 socket send,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())

结果:

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

原文:https://www.cnblogs.com/lijinlei521/p/12707815.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值