Python 反复构造和销毁上下文会产生错误#1260

Python 反复构造和销毁上下文会产生错误#1260,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,在我的项目中,我需要反复构造和破坏上下文,但它会给出一个错误 例如: import zmq for i in range(100): print(i) context = zmq.Context() data_socket = context.socket(zmq.SUB) data_socket.connect("tcp://127.0.0.1:5552") data_socket.setsockopt_string(zmq.SUBSCRIBE, ""

在我的项目中,我需要反复构造和破坏上下文,但它会给出一个错误

例如:

import zmq

for i in range(100):
    print(i)
    context = zmq.Context()
    data_socket = context.socket(zmq.SUB)
    data_socket.connect("tcp://127.0.0.1:5552")
    data_socket.setsockopt_string(zmq.SUBSCRIBE, "")
    context.destroy()
它回来了

0
1
2
3
4
5
6
7
8
9
10
11
12
13
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    data_socket.connect("tcp://127.0.0.1:5552")
  File "zmq/backend/cython/socket.pyx", line 580, in zmq.backend.cython.socket.Socket.connect
  File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Socket operation on non-socket
0
1.
2.
3.
4.
5.
6.
7.
8.
9
10
11
12
13
回溯(最近一次呼叫最后一次):
文件“test.py”,第7行,在
数据插座连接(“tcp://127.0.0.1:5552")
文件“zmq/backend/cython/socket.pyx”,第580行,位于zmq.backend.cython.socket.connect中
文件“zmq/backend/cython/checkrc.pxd”,第25行,在zmq.backend.cython.checkrc.\u check\u rc
zmq.error.ZMQError:非套接字上的套接字操作

套接字选项必须放在
.connect()
.bind()
方法之前,您可以从
zmq.Context()
创建单元实例

试试看:

import zmq

context = zmq.Context.instance()

for i in range(100):
    print(i)
    data_socket = context.socket(zmq.SUB)
    data_socket.setsockopt(zmq.SUBSCRIBE, b"")
    data_socket.connect("tcp://127.0.0.1:5552")

context.destroy()

[你的答案]:

但是,如果您想以自己的方式进行操作,则应在每次迭代中关闭套接字,这样您的代码片段将是:

import zmq

for i in range(100):
    ctx = zmq.Context.instance()
    sock = ctx.socket(zmq.SUB)
    sock.setsockopt(zmq.SUBSCRIBE, b'')
    sock.connect('tcp://127.0.0.1:5552')
    sock.close()  # Note
    ctx.destroy()
    print('ctx closed status: ', ctx.closed, ' iteration: ', i)
输出:


如果你的问题解决了,你可以投票支持我的答案:)谢谢你的回复。如果我想使用第一个选项,是否不需要关闭插座?不客气。不,但这完全取决于您的代码策略。在本例中,两个代码段都可以正常工作。
('ctx closed status: ', True, ' iteration: ', 0)
('ctx closed status: ', True, ' iteration: ', 1)
('ctx closed status: ', True, ' iteration: ', 2)
('ctx closed status: ', True, ' iteration: ', 3)
('ctx closed status: ', True, ' iteration: ', 4)
('ctx closed status: ', True, ' iteration: ', 5)
('ctx closed status: ', True, ' iteration: ', 6)
('ctx closed status: ', True, ' iteration: ', 7)
('ctx closed status: ', True, ' iteration: ', 8)
('ctx closed status: ', True, ' iteration: ', 9)
('ctx closed status: ', True, ' iteration: ', 10)
('ctx closed status: ', True, ' iteration: ', 11)
('ctx closed status: ', True, ' iteration: ', 12)
('ctx closed status: ', True, ' iteration: ', 13)
('ctx closed status: ', True, ' iteration: ', 14)
.
.
.