在试验ZeroMQ Push/Pull(他们称之为Pipeline)套接字类型时,我很难理解这种模式的效用.它被称为"负载平衡器".
如果单个服务器向多个工作人员发送任务,推/拉将在所有客户端之间均匀地分发任务.3个客户端和30个任务,每个客户端获得10个任务:client1获取任务1,4,7,... client2,2,5,...等等.很公平.从字面上看.
但是,在实践中,通常存在任务复杂性或客户端计算资源(或可用性)的非同类混合,然后这种模式严重破坏.所有任务似乎都是事先安排好的,服务器不了解客户端的进度或者是否可用.如果client1发生故障,其余的任务不会发送到其他客户端,但仍会为client1排队.如果client1保持关闭状态,则永远不会处理这些任务.相反,如果客户端处理其任务的速度更快,则它不会获得进一步的任务并保持空闲状态,因为它们仍然安排在其他客户端上.
使用REQ/REP是一种可能的解决方案 然后,任务仅被提供给可用资源.
我错过了什么吗?如何Push/Pull有效地使用?有没有办法用这种套接字类型来处理客户端,任务等的不对称性?
谢谢!
这是一个简单的Python示例:
# server
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUSH)
#socket = context.socket(zmq.REP) # uncomment for Req/Rep
socket.bind("tcp://127.0.0.1:5555")
i = 0
time.sleep(1) # naive wait for clients to arrive
while True:
#msg = socket.recv() # uncomment for Req/Rep
socket.send(chr(i))
i += 1
if i == 100:
break
time.sleep(10) # naive wait for tasks to drain
Run Code Online (Sandbox Code Playgroud)
.
# client
import zmq …Run Code Online (Sandbox Code Playgroud) 使用matplotlib,似乎设置了唯一的一次sharex或sharey轴参数sub_plot创建过程中(add_subplot(),subplot(),subplots()).对于axes类,有一些方法可以获得轴共享(get_shared_x_axes(),get_shared_y_axes()),但没有相应的方法来设置共享.也许这是一个API监督,或者它可能不适合在架构上.
有没有办法更改共享轴参数?
对于那些问为什么的人:我正在动态地使用一个图表矩阵,并且可以使用视图限制来控制它,但似乎可能有一种更简单的方法,并且开启/关闭共享并使用自动缩放将是它.
谢谢.
在Python中将二进制数据字符串转换为数值的最快方法是什么?
我正在使用struct.unpack_from(),但是达到了性能限制.
上下文:传入流是混合二进制和ASCII数据.ASCII数据转换是通过ctypes在C中完成的.通过ctypes在C中实现解包产生了与解包相似的性能.我的猜测是呼叫开销太大了.我希望找到一种原生的类C强制方法(但不是Pythonic).很可能所有这些代码都需要转移到C.
流是网络字节顺序(big-endian),机器是little-endian.转换的示例是:
import struct
network_stream = struct.pack('>I', 0x12345678)
(converted_int,) = struct.unpack_from('>I', network_stream, 0)
Run Code Online (Sandbox Code Playgroud)
我不太关心处理流格式,而不是二进制转换的一般情况,如果有替代的话unpack.例如,socket.ntohl()需要一个int,并且int()不会转换二进制数据字符串.
谢谢你的建议!
当在绘制文本matplotlib与text(),然后交互地平移所述图像时,所得拉伸文本不会夹在数据窗口.这与使用annotate()作品绘制数据或绘制文本的方式相反,并且在text()使用数据窗口坐标时没有直观意义.
import matplotlib.pyplot as plt
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.text(0.5, 0.2, 'text')
ax.annotate('anno', (0.5, 0.3))
plt.draw()
Run Code Online (Sandbox Code Playgroud)
从各个方面以交互方式将文本从数据窗口中移出.所述annotate()绘制"阿鲁"当参考点横切数据窗口边界,而被夹text()绘制"文本"是没有的.
我不确定这种行为是一个功能还是一个bug,但肯定看起来像后者,因为这个文本干扰了轴标签等.使用1.2.1与TkAgg后端.
另一个问题是如何正确地将所有文本剪辑到数据窗口之外,而不仅仅是在参考坐标的情况下.
谢谢!
在着眼于C API为MessagePack,有多个功能以适当地串行化(包)中的数据,根据类型:msgpack_pack_uint8,msgpack_pack_int32,...
在API中似乎没有相应的调用来解压缩数据. msgpack_unpack_next返回一个msgpack_object.这些对象仅具有粗粒度类型(类型中最大的:int64,double,...),基于所包含的枚举.
我在这里错过了什么吗?是期望使用粗物体然后再施放?
如何正确拆包?
此外,有没有好的文档或用法示例?网站上的那些是微不足道的.