由线程API调用引起的Nonce错误的解决方案



我正在对线程进行API调用。API要求每个调用的Nonce都大于最后一个调用。

我正在使用以下代码生成Nonce:

req['none']=int(time.time()*1000000)

我收到错误:

"{u'error':u'Nonce必须大于1427495062551856。您提供了1427495062544266."。

我认为错误的原因是API请求/响应时间的细微变化,导致一个API请求在前一个请求之前到达服务器(Nonce会更低)。

有人能解决这个问题吗?

我在使用Poloniex加密货币交易所API时遇到了这个问题。有些买卖电话由于某种原因挂了2分钟(你可能会问Poloniex为什么会这样)。我的呼叫是异步的,所以新的呼叫是在不等待"挂起"呼叫的情况下进行的。

我刚刚重新进行了这些挂起的调用,检查错误字符串上是否有"Nonce必须大于"前缀。你可以在我的github repo 中看到代码

您的答案将在很大程度上取决于外国API拒绝的成本。

避免来自多个独立客户端的所有错误可能是不可能的。在创建每个nonce时,您的线程必须在它们之间进行协调,以便按递增的顺序创建它们。此外,在使用每个nonce时,这样它们就不会无序地到达远端。最后,当远程API看到其使用的nonce时,每个线程都必须通知其他线程,因为说"我现在发送nonce 1000"会声明1000和所有更大的值,直到该线程使用1000为止,此时其他线程可以安全地尝试1001。

如果一个糟糕的API调用的代价真的很糟糕,那么您可能会遇到这样的情况:一次只有一个线程可以使用该API——每个线程都必须声明一些独占锁,处理nonce和API调用,然后释放锁。这可能会破坏您使用线程的目的。

我认为更好的解决方案是让每个线程通过创建一个新的nonce并重试API调用来处理这些拒绝。无论如何,您可能需要这样一个函数,因为即使您完美地创建了nonce值,网络速度和路由的变化也可能导致这些请求无法正常到达API服务器。

简而言之,我认为你无法消除这些错误,所以要集中精力降低它们的成本。

最新更新