我在线程上进行API调用。 API要求每次调用使Nonce大于最后一次调用。
我使用此代码生成Nonce:
req [' nonce'] = int(time.time()* 1000000)
我收到错误:
" {u'错误':你' Nonce必须大于1427495062551856.您提供了1427495062544266。'}"。
我认为错误的原因是API请求/响应时间的微小变化导致一个API请求在先前请求之前到达服务器(具有较低的Nonce)。
有人有解决方案吗?
答案 0 :(得分:1)
使用Poloniex加密货币兑换API时遇到了这个问题。由于某种原因,一些买卖电话挂了2分钟(你可能会问Poloniex为什么会这样)。我的呼叫是异步的,所以新的呼叫是在没有等待"挂"调用
我刚刚重新制作这些挂断电话,检查" Nonce必须大于"错误字符串上的前缀。您可以在我的github repo
中查看代码答案 1 :(得分:0)
您的答案将在很大程度上取决于外国API的拒绝成本。
避免来自多个独立客户端的所有错误可能是不可能的。在创建每个nonce时,你的线程必须在它们之间进行协调,以便它们按递增的顺序创建。此外,当使用每个随机数时,它们不会无序到达远端。最后,当远程API看到 使用的nonce时,每个线程必须通知其他人,因为说"我现在发送nonce 1000"声称1000 和所有更大的值,直到该线程完成1000,此时其他线程尝试1001是安全的。
如果错误的API调用的成本非常糟糕,您可能会遇到这样的情况:一次只有一个线程可以使用该API - 每个线程都必须声明一些独占锁,处理nonce和API调用,然后释放锁。这可能会破坏您使用线程的目的。
我认为更好的解决方案是让每个线程通过创建新的nonce并重试API调用来处理这些拒绝。您无论如何都可能需要这样的功能,因为即使您完美地创建了nonce值,网络速度和路由的变化也可能导致这些请求无序地到达API服务器。
简而言之,我认为您无法消除这些错误,因此请专注于降低成本。