如何在服务器处理之前仅进行“n”API调用

时间:2014-02-27 19:44:49

标签: python python-2.7 python-3.x

我有两个相同大小的大型列表。我正在使用两个列表的第i个元素作为参数进行子进程调用:

for index in range(len(skuList)):
    sku = skuList[index]
    qty = qtyList[index]
    cmd1 = 'php -f ReviseItem.php %s %s' % (sku,qty)
    print cmd1
    args1 = shlex.split(cmd1)
    p=subprocess.Popen(args1)
    p.wait()

我实际上是在ReviseItem脚本中进行API调用。但是,API服务器是这样的,我最多可以发出15个请求,并在接下来的2分钟内进行限制。如何修改我的代码以满足此要求。生成15个子流程后,有没有办法停止执行2分钟?

编辑:在15次请求后等待2分钟后,我仍然受到限制。在提出请求被处理之前,似乎我受到了限制,如提到here,而不是在提出请求之后。

EDIT2 :如果我受到限制且请求未得到处理,我会在标准输出中收到以下消息(其中包括):

<ErrorResponse xmlns="http://mws.amazonaws.com/doc/2009-01-01/">
  <Error>
    <Type></Type>
    <Code>RequestThrottled</Code>
    <Message>Request is throttled</Message>
  </Error>
  <RequestID>3ca74b8b-cdc2-47df-b48b-043eb5411cda</RequestID>
</ErrorResponse>

此外,我可以进行另一次API调用,以找出上次处理的请求的请求ID。同样,请求ID在呼叫的标准输出中(原始呼叫和此呼叫)以及其他消息

3 个答案:

答案 0 :(得分:1)

当然 - 只需保留产生子进程的最后15次的时间戳列表。在产生新的子流程之前,如果列表中有15个时间戳,请检查最旧的时间戳是否至少有两分钟的时间;如果不是,请等待适当的时间。然后添加新的时间戳,如果超过15,则弹出最旧的时间戳。

答案 1 :(得分:1)

使用一个全局变量,该变量递增并检查它是否达到计数15.使用os.sleepsys.sleep(在python中适用的任何库)。伪代码是:

myCount = 0
for index <loop>
  myCounter++
  if myCounter % 15 == 0:
    os.sleep( 2 * 60 ) # or 2000 * 60

查找库,我发现它是time.sleep()。代码将成为:

import time
myCounter = 0
for index in range(len(skuList)):
    myCounter += 1
    if myCounter % 15 == 0:  time.sleep( 2 * 60 )
    sku = skuList[index]
    qty = qtyList[index]
    cmd1 = 'php -f ReviseItem.php %s %s' % (sku,qty)
    print cmd1
    args1 = shlex.split(cmd1)
    p=subprocess.Popen(args1)
    p.wait()

答案 2 :(得分:0)

假设他们按顺序处理它们。您可以保留未完成的请求ID列表,然后当您不满时,停止并拨打电话以获取最后处理的ID,直到您可以删除任何ID。删除这些ID并继续。