diff --git a/vn.ib/README.md b/vn.ib/README.md index 55c8adef..f7fab9b5 100644 --- a/vn.ib/README.md +++ b/vn.ib/README.md @@ -34,10 +34,13 @@ shared_ptr.h和SoftDollerTier.h中加入了对象比较函数的代码,用于 3. vn.ib/build/lib下的vnib.so复制到vn.ib/test文件夹下,运行test.py 4. 会出现上面的undefined symbol错误 +更新:编译问题已解决,需要在EClient.h和EClient.cpp中,加入EncodeField这一对EncodeField的偏特化实现(well,我并不十分确定是否该用“偏特化”这个词),具体请参考linux文件夹下的代码。 + +但目前Linux下的编译在调用eConnect函数时会卡住,从TWS中查看会有API发起的连接处于“pending”的状态,猜测问题可能出在底层的POSIX线程锁相关的地方。 + ### API版本 版本:IB API for Windows beta 9.72.18 日期:2016-09-14 链接:[http://interactivebrokers.github.io/](http://interactivebrokers.github.io/) - diff --git a/vn.rpc/vnrpc.py b/vn.rpc/vnrpc.py index 811ca1ab..9558281b 100644 --- a/vn.rpc/vnrpc.py +++ b/vn.rpc/vnrpc.py @@ -8,6 +8,10 @@ import zmq from msgpack import packb, unpackb from json import dumps, loads +import cPickle +pDumps = cPickle.dumps +pLoads = cPickle.loads + # 实现Ctrl-c中断recv signal.signal(signal.SIGINT, signal.SIG_DFL) @@ -18,12 +22,14 @@ class RpcObject(object): """ RPC对象 - 提供对数据的序列化打包和解包接口,目前提供了json和msgpack两种工具。 + 提供对数据的序列化打包和解包接口,目前提供了json、msgpack、cPickle三种工具。 msgpack:性能更高,但通常需要安装msgpack相关工具; json:性能略低但通用性更好,大部分编程语言都内置了相关的库。 + cPickle:性能一般且仅能用于Python,但是可以直接传送Python对象,非常方便。 - 因此建议尽量使用msgpack,如果要和某些语言通讯没有提供msgpack时再使用json。 + 因此建议尽量使用msgpack,如果要和某些语言通讯没有提供msgpack时再使用json, + 当传送的数据包含很多自定义的Python对象时建议使用cPickle。 如果希望使用其他的序列化工具也可以在这里添加。 """ @@ -32,7 +38,8 @@ class RpcObject(object): def __init__(self): """Constructor""" # 默认使用msgpack作为序列化工具 - self.useMsgpack() + #self.useMsgpack() + self.usePickle() #---------------------------------------------------------------------- def pack(self, data): @@ -63,6 +70,16 @@ class RpcObject(object): def __msgpackUnpack(self, data): """使用msgpack解包""" return unpackb(data) + + #---------------------------------------------------------------------- + def __picklePack(self, data): + """使用cPickle打包""" + return pDumps(data) + + #---------------------------------------------------------------------- + def __pickleUnpack(self, data): + """使用cPickle解包""" + return pLoads(data) #---------------------------------------------------------------------- def useJson(self): @@ -75,6 +92,12 @@ class RpcObject(object): """使用msgpack作为序列化工具""" self.pack = self.__msgpackPack self.unpack = self.__msgpackUnpack + + #---------------------------------------------------------------------- + def usePickle(self): + """使用cPickle作为序列化工具""" + self.pack = self.__picklePack + self.unpack = self.__pickleUnpack ########################################################################