Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在zmq的推/拉模式中设置hwm?_Python_Zeromq_Pyzmq - Fatal编程技术网

Python 如何在zmq的推/拉模式中设置hwm?

Python 如何在zmq的推/拉模式中设置hwm?,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,我发现了一个类似的问题,但它不能解决我的问题 我想控制推送套接字排队的消息数,但它不工作,仍然排队1000条消息。 所以我想知道如何设置推送插座的hwm。提前谢谢 我的环境是:libzmq4.0.4、pyzmq14.1.0、python3.3 这是我的密码: server.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- import random import zmq class TestPush(object): def _

我发现了一个类似的问题,但它不能解决我的问题

我想控制推送套接字排队的消息数,但它不工作,仍然排队1000条消息。
所以我想知道如何设置推送插座的hwm。提前谢谢

我的环境是:libzmq4.0.4、pyzmq14.1.0、python3.3

这是我的密码:

server.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random

import zmq


class TestPush(object):

    def __init__(self):
        self.ctx = zmq.Context()

        random.seed()

    def run(self):
        task_snd = self.ctx.socket(zmq.PUSH)
        task_snd.setsockopt(zmq.SNDHWM, 10)
        task_snd.bind('tcp://*:53000')        

        while True:
            workload = str(random.randint(1, 100))
            task_snd.send(workload.encode('utf-8'))
            print('Send {0}'.format(workload))


if __name__ == '__main__':
    test_push = TestPush()
    test_push.run()
client.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import time
import random

import zmq


class TestPull(object):

    def __init__(self):
        self.ctx = zmq.Context()

    def run(self):
        task_rcv = self.ctx.socket(zmq.PULL)
        task_rcv.setsockopt(zmq.RCVHWM, 1)
        task_rcv.connect('tcp://localhost:53000')

        while True:
            msg = task_rcv.recv()
            print('Receive msg: {0}'.format(msg))

            time.sleep(random.randint(2, 3))


if __name__ == '__main__':
    test_pull = TestPull()
    test_pull.run()

当我试图在推拉式插座上设置HWM(高水位线)时,ZeroMQ也遇到了类似的问题。甚至,它也不适用于pub和sub套接字。我想解释一下发生了什么,以及它是如何解决的

我做了两个脚本,第一个是作为一个带推式插座的发送者,另一个是作为一个带拉式插座的接收者。在两个插座上将HWM设置为10。在receiver脚本中,我在收到每条消息后延迟5秒。然后,我使用100条消息的循环运行发送者脚本(在保持接收方为接收而运行之后)

我所期望的: 接收方队列和发送方队列将到达hwm。之后,发件人将停止发送更多邮件

但是发生了什么: 发送方发送所有100条消息并退出。但接收方一直在一个接一个地处理消息,直到接收到所有消息为止

经过研究,我找到了原因: 有一种称为内核套接字缓冲区的东西,它位于发送方套接字和接收方套接字之间。每当进程打开套接字时,内核都会为tcp套接字分配内存空间,默认情况下为128KB。内核套接字缓冲区适用于发送方和接收方套接字(因此总缓冲区为128KB+128KB)。我的邮件大小以字节为单位(带有一些字符的整数)。因此,总消息缓冲将如下所示:

缓冲区消息总数= 发送器插座 +发送方套接字的内核套接字缓冲区(128KB) +接收机插座 +发送方套接字的内核套接字缓冲区(128KB)

解决方案: 现在,我把我的消息长度改为1KB多一点。然后再次执行测试,发现发送了约260条消息(如预期),此后发送方会在间隔时间内停止,直到接收方收到一些消息并再次启动


附加信息 为了使推送套接字即使在接收方无法接收的情况下也能继续发送消息,我们可以在发送例程中使用NOBLOCK选项,但是接收方丢失的消息数量会增加很多。所以,更好的选择是使用Poll或timeout,然后使用NOBLOCK选项调用send例程


请注意,您可以使用zeromq的SNDBUFF/RCVBUFF,但操作系统可能不遵守它(就我的情况而言,它不起作用)。

设置HWM值后,您能用“getsocktopt”函数读取它们吗?因此,您可以验证是否设置了值。@AhmetKakıcıYes,
getsockopt()
返回的值表明相应的hwm值已更改。