当我从套接字发送数据然后立即关闭它(不更改默认设置)时,小数据大小会成功发送,但大数据(> 2MB)则不会。
以下是我设置接收器的方式(最后在 recv() 上阻塞):
In [1]: import zmq
In [2]: ctx = zmq.Context()
In [3]: socket = ctx.socket(zmq.PULL)
In [4]: socket.connect("ipc://@foo")
In [5]: msg = socket.recv()
然后是发件人:
In [1]: import zmq
In [2]: ctx = zmq.Context()
In [3]: socket = ctx.socket(zmq.PUSH)
In [4]: socket.bind("ipc://@foo")
In [5]: arr = bytearray([1]*100)
In [6]: len(arr)
Out[6]: 100
In [7]: socket.send(arr); socket.close()
接收器得到数据就好了:
In [5]: msg = socket.recv()
In [6]: len(msg)
Out[6]: 100
但是,如果我使用更大的消息,例如arr = bytearray([1]*int(2e6))
,那么接收器会一直阻塞,等待数据。
更改 LINGER 设置似乎没有任何区别(我相信无论如何默认为无限等待)。
在发送方的发送和关闭之间添加 sleep(1)
socket.send(arr); time.sleep(1); socket.close()
可以解决问题:接收方正确获取数据。
如果 LINGER 默认为 -1,为什么这在没有睡眠的情况下不起作用?在处理大量数据时,发送然后立即关闭套接字的正确方法是什么?