3

スレッドで API 呼び出しを行っています。API では、各呼び出しが最後の呼び出しよりも大きい Nonce を持つ必要があります。

このコードを使用してナンスを生成しています:

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

エラーが発生します:

"{u'error': u'Nonce は 1427495062551856 より大きくなければなりません。1427495062544266 を指定しました。'}".

エラーの原因は、API 要求/応答時間のわずかな変動により、1 つの API 要求が前の要求 (より低いノンスを持つ) よりも先にサーバーに到達することであると考えています。

誰かがこれに対する解決策を持っていますか?

4

2 に答える 2

0

あなたの答えは、外部 API からの拒否がどれほど高くつくかに大きく依存します。

複数の独立したクライアントからのすべてのエラーを回避することは不可能な場合があります。スレッドは、各ナンスを作成するときにスレッド間で調整する必要があるため、昇順で作成されます。また、各ノンスを使用する場合は、順不同で遠端に到達しないようにします。そして最後に、各スレッドは、使用していたノンスがリモート API によって認識されたときに、他のスレッドに通知する必要あります。これは、「私は今ナンス 1000 を送信しています」と言うと、そのスレッドが 1000 で完了するまで、 1000とそれ以上のすべての値が要求されるためです。この時点で、他のスレッドが 1001 を試行しても安全です。

不適切な API 呼び出しのコストが非常に大きい場合、一度に 1 つのスレッドしかその API を使用できない状況になる可能性があります。各スレッドは、排他ロックを要求し、ナンスと API 呼び出しを処理し、ロックを解除します。これは、スレッドを使用する目的に反する可能性があります。

より良い解決策は、新しい nonce を作成して API 呼び出しを再試行することにより、各スレッドでこれらの拒否を処理することだと思います。ナンス値を完全に作成したとしても、ネットワーク速度とルーティングの変動により、これらのリクエストが API サーバーに順不同で到達する可能性があるため、おそらくそのような関数が必要になるでしょう。

要するに、これらのエラーをなくすことはできないと思うので、コストを削減することに集中してください。

于 2015-03-28T20:15:40.643 に答える