小编jom*_*ido的帖子

丢失网络连接时ZMQ Pub-Sub程序失败

我在中型网络上使用ZMQ 2.1进行简单的pub-sub设置.虽然有些订阅者正在使用C#绑定,但其他订阅者正在使用Python绑定,而我遇到的问题也是相同的.

如果我从运行订户的计算机上拔出网络电缆,我会收到一个无法捕获的错误,该错误会立即终止该订户.

这是Python中订阅者的一个非常简单的示例(不是实际的生产代码,但足以重现问题):

import zmq

def main(server_address, port):

    context = zmq.Context()
    sub_socket = context.socket(zmq.SUB)
    sub_socket.connect("tcp://" + server_address + ":" + str(port))
    sub_socket.setsockopt(zmq.SUBSCRIBE, "KITH1S2")

    while True:

        msg = sub_socket.recv()      
        print msg  

if __name__ == "__main__": main("company-intranet", 4000)
Run Code Online (Sandbox Code Playgroud)

在C#中,程序只是默默地终止.在Python中我至少得到这个:

断言失败:rc == 0(....\src\zmq_connector.cpp:48)

此应用程序已请求Runtime以不寻常的方式终止它.有关更多信息,请联系应用程序的支持团队.

我尝试过非阻塞版本和轮询版本,但在任何一种情况下,这种即时终止问题仍然存在.有什么明显我应该做的但是我不是吗?(这对其他人来说很明显:)).

编辑:

找到以下内容:https://zeromq.jira.com/browse/LIBZMQ-207

似乎它是/已知的问题.

该链接进一步链接到Github,其中2.1.10的更改日志有此注释:

  • 修复了问题207,zmq_connecter.cpp中的断言失败:48,当使用了无效的zmq_connect()字符串,或无法解析主机名时.在这两种情况下,zmq_connect()调用现在返回-1.

尽管connect()确实在Python中抛出了一个无效参数异常(显然不是C#?),但recv()仍然失败.如果订户计算机突然丢失网络,则该订户将停止运行.

所以 - 我将尝试使用IP地址而不是命名地址,看看是否会绕过这个问题.不理想,但比insta-crash更好.

c# python publish-subscribe zeromq

6
推荐指数
1
解决办法
1547
查看次数

边角半径填补暴行

我有一个像这样定义的边框:

<Border x:Name="BaseBar" BorderThickness="1,1,1,2" Height="29" CornerRadius="0,0,16,16" Grid.Row="2">
<Border.BorderBrush>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
        <GradientStop Color="#FF6E6E6E" Offset="0.004"/>
        <GradientStop Color="#FF1A1A1A" Offset="0.043"/>
    </LinearGradientBrush>
</Border.BorderBrush>
<Border.Background>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
        <GradientStop Color="#FF313131" Offset="0"/>
        <GradientStop Color="#FF232323" Offset="1"/>
    </LinearGradientBrush>
</Border.Background>
Run Code Online (Sandbox Code Playgroud)

但是,当角落具有半径时,它不能正确填充.这是左下角的图像:

在半径角落边框填充不佳

你可以清楚地看到更明亮的背景照耀着更深的前景.有没有办法减轻这种情况?

编辑:附加图片,显示它是背景照亮:

在半径角落边框填充不佳

在这种情况下,只能看到背景的白色一半,而黑色的一半(同时也通过)是不可检测的.

wpf

5
推荐指数
1
解决办法
2464
查看次数

getattr与inspect.getmembers

可以使用getattr(obj,attr)或inspect.getmembers(obj)获取对象属性,然后按名称过滤:

import inspect

class Foo(object):

    def __init__(self):

        self.a = 100

    def method(self): pass

foo = Foo()
method_by_getattr = getattr(foo, 'method')

foo_members = inspect.getmembers(foo) 
method_by_inspect = [member[1] for member in foo_members 
                        if member[0] == "method"][0]

print (id(method_by_getattr), method_by_getattr, type(method_by_getattr))
print (id(method_by_inspect), method_by_inspect, type(method_by_inspect))

a_by_getattr = getattr(foo, "a")
a_by_inspect = [member[1] for member in foo_members
                        if member[0] == "a"][0]

print (id(a_by_getattr), a_by_getattr, type(a_by_getattr))
print (id(a_by_inspect), a_by_inspect, type(a_by_inspect))

# (38842160L, <bound method Foo.method of <__main__.Foo object at 0x00000000025EF390>>, <type 'instancemethod'>)
# (39673576L, <bound …
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
2
解决办法
6169
查看次数

标签 统计

python ×2

c# ×1

publish-subscribe ×1

wpf ×1

zeromq ×1