如何在 while 循环内更新 api 调用?

Posted

技术标签:

【中文标题】如何在 while 循环内更新 api 调用?【英文标题】:How do I update an api call within a while loop? 【发布时间】:2021-09-18 14:11:33 【问题描述】:

我正在做一个简单的请求,它使用来自多边形扫描的随机散列从区块链返回确认号。

我遇到的问题是 while 循环,它不断循环使用相同的确认号码,而不是更新区块链上表示的真实号码。

例如,当哈希确认为 100 时,它将继续打印 100,而区块链确认在 polyscan 上上升。

我希望 ctc 变量在 while 循环中更新为真正的确认。

from web3 import Web3
web3 = Web3(Web3.HTTPProvider(<APIKEY>))


check_txn_confirmations = web3.eth.blockNumber - web3.eth.getTransaction('0x7a0b596a664e5b56091b775d294d374364db00cab531b8dc18c70932896ccf44ec').blockNumber

ctc = check_txn_confirmations

    while ctc < 260:
        print("confirmations are:", ctc)
        time.sleep(10)
        print("waiting 10seconds..")
    else:
        print("confirmations are larger")

【问题讨论】:

在 While 循环中发送 API 请求是一个非常糟糕的主意,我建议更改程序的结构。 谢谢。您能否建议一种方法,我可以在程序中多次 ping 并考虑相同的目标? 为什么不能在while循环中移动调用?没有其他方法可以做到这一点,除非你想写一个基于回调的应用程序,或者一个多线程/异步应用程序。 我无法将调用移动到循环中,因为输出是 while 条件的一部分。除非我错过了什么? 如果您在循环内更改“ctc”的值,新值将在下次评估 while 时使用。事实上,总是需要在循环内部更改条件,否则不会退出任何 while 循环。 【参考方案1】:

这是你想做的,也是你不应该做的:

while True:

    check_txn_confirmations = web3.eth.blockNumber - web3.eth.getTransaction('0x7a0b596a664e5b56091b775d294d374364db00cab531b8dc18c70932896ccf44ec').blockNumber
    ctc = check_txn_confirmations

    if ctc < 260:
        print("confirmations are:", ctc)
        time.sleep(10)
        print("waiting 10seconds..")
    else:
        print("confirmations are larger")
        break

在 while 循环中发送请求存在许多问题。

大多数 API 都有请求限制,并且请求限制通常与按使用量付费的协议类型挂钩。如果/当您的程序意外卡在无限 while 循环中时,您就会遇到问题。您的请求限制达到或余额达到 0(夸大了,但您明白了)。

相反,我建议您研究回调和异步。但是对于简单的应用,回调就足够了。

【讨论】:

感谢您的解决方案以及对这种结构可能出现的问题的详细解释! 回调和异步如何防止您描述的问题?它们只是一种精巧的循环形式,可让您的计算机执行其他操作,而不是反复休眠 10 秒。

以上是关于如何在 while 循环内更新 api 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量值从循环A更新到另一个循环B - 在bash中

如何使用 while 循环更新行?

获取mysqli结果时如何在while循环内抛出异常?

是否可以使用 PHP 将数据发布到 while 循环内的链接? [复制]

我需要有关如何在它位于 do-while 循环内的情况下创建循环的帮助

如何在 React 的 while 循环中更新状态