- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想在 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
?由于 PUBHandler
类有一个 createLock()
我认为它不是线程保存的...
为了完整起见,我想提一下 doc of the PUBHandler class
我在 Win7 上使用 python(x,y) 发行版,其中包含 python 2.7.10 和 pyzmq 14.7.0-14
[更新]我排除了 Windows 防火墙作为丢失包的来源
最佳答案
问题出在订阅者一方。最初,订阅者过滤掉所有消息,直到设置过滤器。使用 socket.setsockopt(opt, value)
函数来存档它。pyZMQ
对这个函数的使用描述不是很清楚:
getsockopt(opt) get default socket options for new sockets created by this Context
但是zmq_setsockopt
函数的文档非常清楚(see here):
int zmq_setsockopt (void *socket, int option_name, const void *option_value, size_t option_len)
...
ZMQ_SUBSCRIBE
: Establish message filter TheZMQ_SUBSCRIBE
option shall establish a new message filter on aZMQ_SUB
socket. Newly createdZMQ_SUB
sockets shall filter out all incoming messages, therefore you should call this option to establish an initial message filter.
因此,解决方案是使用 socket.setsockopt(zmq.SUBSCRIBE,filter)
设置过滤器,其中 filter 是您要过滤的字符串。使用 filter=''
显示所有消息。像 filter='ERROR'
这样的过滤器只会显示错误消息并抑制所有其他类型,例如 WARNING
、INFO
或 DEBUG
。
这样,sub_client()
函数如下所示:
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)
socket.setsockopt(zmq.SUBSCRIBE,'')
# Process 30 updates
print "Listening to publishers..."
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()
关于python - 在 python 中使用 pyzmq 的日志处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40218325/
我最近开始使用 ZeroMQ 并观察到 有时,ZeroMQ 上下文的初始化可能需要多达 40 秒 .通常它比这快得多。 例如: import zmq # the next line will so
我有一些代码正在监视其他一些正在更改的文件,我想做的是启动使用带有不同套接字的 Zeromq 的代码,我现在这样做的方式似乎会导致 libzmq 中的某个地方断言失败,因为我可能会重复使用同一个套接字
我正在使用 PyZMQ 创建请求/回复服务器,并且我试图弄清楚为每个新客户端连接创建线程的行为是否由 PyZMQ 自动处理。最终,我试图弄清楚来自一个客户端的需要很长时间才能回复的请求是否会阻止来自所
我有以下发布者代码,它实例化一些类实例并发布一些消息。 但是,我在订阅者端没有收到任何内容。 发布商 import zmq import time from multiprocessing impor
我一直在想办法在我的套接字尚未连接到绑定(bind)地址时如何关闭 Context 实例(或者如果我需要的话)。这是我的演示代码: import zmq import json data = {} d
有人能给我指出一个带有 Python 绑定(bind)的 REQ/REP 非阻塞 ZeroMQ (0MQ) 的例子吗?可能是我对 ZMQ 的理解有问题,但是我在网上找不到例子。 我在 Node.JS
大家好 StackOverflow 的好人。 我正在使用 pyzmq,我有一些长时间运行的进程,这导致我发现套接字句柄处于打开状态。我已将有问题的代码缩小为以下内容: import zmq uri =
我有以下代码使用请求和回复模式从服务器发送数组到客户端, def send_array( socket, A, flags = 0, copy = True, track = False ): ""
我已经连接了 zeromq,“msg_in”已经排队。如果在该时间段内没有新消息队列来设置超时。如何设置超时。以下是核心代码 requestDict = {"id":111, "name":"test
我目前正在研究一些用 C 编写的模拟代码,这些代码在不同的远程机器上运行。当 C 部分完成后,我想通过使用 python 模拟 api 和某种作业队列系统扩展它来简化我的工作,它应该执行以下操作: 1
我对 PyZMQ 中的 HWM 行为感到困惑。我希望以下代码会被阻止 失败示例 In [1]: import zmq In [2]: context = zmq.Context() In [3]: a
我有一个ROUTER,其目的是积累来自多个DEALER客户端的图像数据并对完整图像执行OCR。我发现处理 OCR 最有效的方法是使用 Python 的多处理库;累积的图像字节被放入到队列中,以便在单独
我正在尝试使用 pyzmq 的内置日志处理程序(参见 here)为我的分布式应用程序实现集中式日志记录服务器。虽然从架构的角度我可以理解 PUB/SUB 模式的使用,但我无法掌握这种系统的正确技术实现
我正在尝试与通过 ZeroMQ 套接字开始使用 multiprocessing.Process 的子进程进行通信。我知道存在与 multiprocessing 模块内的子进程通信的解决方案,但我希望最
我想限制我的 ZeroMQ 消息队列在 Python 应用程序中消耗的内存量。我知道设置高水位线会限制在发送方排队的数量,但是有没有办法控制在接收方排队的数量? Python ZeroMQ 绑定(bi
在 python 中寻找有效的 IPC 解决方案时,我偶然发现了 zeromq;我有几个 python 进程需要在主进程中对来自 dict 的数据进行一些 cpu 密集型处理。这些工作进程只能从字典中
这是我的第一篇 StackOverflow 帖子! 我在创建具有 pyzmq (v22.0.2) 依赖项的 pyinstaller(v4.2) 可执行文件时遇到问题。我通过运行“pyinstaller
根据 ZeroMQ 文档,一旦排队的消息数量达到高水位线,pub 套接字就会删除消息。 这在以下示例中似乎不起作用(是的,我确实在绑定(bind)/连接之前设置了 hwm): import time
我第一次使用 python 中的 asyncio 并尝试将其与 ZMQ 结合起来。 基本上我的问题是我有一个 REP/REQ 系统,位于 async def 中具有我需要等待的功能。值如何不更新。下面
ZMQ socket documentation 中的 ZMQ_PUSH 部分假设在没有下游节点的 PUSH 套接字上调用 send() 应该阻塞,直到至少有一个节点可用。 但是,运行以下代码似乎不会
我是一名优秀的程序员,十分优秀!