3

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

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

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

我收到错误:

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

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

有人对此有解决方案吗?

4

2 回答 2

1

我在使用 Poloniex 加密货币交换 API 时遇到了这个问题。出于某种原因,一些买入或卖出电话挂了 2 分钟(你可能会问 Poloniex 为什么会这样)。我的呼叫是异步的,因此无需等待“挂起”呼叫即可进行新呼叫。

我刚刚重新进行了这些挂起的调用,检查错误字符串上的“Nonce 必须大于”前缀。您可以在我的github 存储库中查看代码

于 2018-01-29T14:16:33.753 回答
0

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

避免来自多个独立客户的所有错误可能是不可能的。在创建每个 nonce 时,您的线程必须相互协调,以便以递增的顺序创建它们。同样在使用每个随机数时,它们不会乱序到达远端。最后,当远程 API 看到它正在使用的随机数时,每个线程都必须通知其他线程,因为说“我现在发送随机数 1000”会声明 1000和所有更大的值,直到该线程完成 1000 ,此时其他线程尝试 1001 是安全的。

如果错误 API 调用的成本非常高,您可能会遇到一次只有一个线程可以使用该 API 的情况 --- 每个线程都必须申请一些排他锁,处理 nonce 和 API 调用,并且然后释放锁。这可能会破坏您使用线程的目的。

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

简而言之,我认为您无法消除这些错误,因此请专注于降低其成本。

于 2015-03-28T20:15:40.643 回答