【发布时间】:2017-03-06 05:24:25
【问题描述】:
我想在 Python 程序中引入基于 zmq 的登录。当我面临ZMQError: Address in use 错误时,我决定将其归结为一个简单的概念证明。我能够运行精简版,但没有收到任何日志条目。这是我使用的代码:
日志发布者:
import time
import logging
from zmq.log import handlers as zmqHandler
logger = logging.getLogger('myapp')
logger.setLevel(logging.ERROR)
zmqH=zmqHandler.PUBHandler('tcp://127.0.0.1:12344')
logger.addHandler(zmqH)
for i in range(50):
logger.error('error test...')
print "Send error #%s" % (str(i))
time.sleep(1)
结果
Send error #0
Send error #1
Send error #2
Send error #3
Send error #4
...
日志订阅者:
import time
import zmq
def sub_client():
port = "12344"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:%s" % port)
# Generate 30 entries
for i in range (30):
print "Listening to publishers..."
message = socket.recv()
print "Received error #%s: %s" % (str(i), message)
time.sleep(1)
sub_client()
结果
Listening to publishers...
所以订阅者在socket.recv() 的调用中被锁定。我在不同的控制台中开始发布者和订阅者。当我使用 netstat 时,这两个进程都会出现:
C:\>netstat -a -n -o | findstr 12344
TCP 127.0.0.1:12344 0.0.0.0:0 LISTEN 1336
TCP 127.0.0.1:12344 127.0.0.1:51937 ESTABLISHED 1336
TCP 127.0.0.1:51937 127.0.0.1:12344 ESTABLISHED 8624
我没有在这里看到我的错误,有什么想法吗?
除了手头的问题,我一般如何使用这个zmq监听器。
我是否必须为每个进程创建一个PUBHandler 实例,然后将其添加到logger 的所有实例中(logging.getLogger('myapp') 创建一个自己的记录器实例,对吗?)还是我必须为每个进程创建一个自己的PUBHandler我使用的所有不同的类?由于PUBHandlerclass 有一个createLock(),我认为它不是线程保存...
为了完整起见,我想提一下doc of the PUBHandler class
我在 Win7 上使用 python(x,y) 发行版,带有 python 2.7.10 和 pyzmq 14.7.0-14
[更新] 我排除了 windows 防火墙作为丢失包的来源
【问题讨论】:
标签: python python-2.7 logging zeromq pyzmq