我注意到一些STEEMIT在线工具返回数据很慢, 特别是当返回的数据很多行时, 经常需要等个几十秒, 非常的不友好. 比如, 现有138人代理给YY银行, 通过 这个代理查询工具 则需要几十秒才能返回数据.
今天我稍微研究了一下, 发现在使用 steem-python中的 converter 特别的慢.
steem = Steem(nodes = steem_nodes)
converter = Converter(steemd_instance = steem)
while some loop:
r.append( "sp": converter.vests_to_sp(vests)})
方法 converter.vests_to_sp() 很慢, 被调用在循环里时, 这就能解释为什么数据量越大的时候需要的时间越长. 看了converter.py代码:
def steem_per_mvests(self):
info = self.steemd.get_dynamic_global_properties()
return (Amount(info["total_vesting_fund_steem"]).amount /
(Amount(info["total_vesting_shares"]).amount / 1e6))
def vests_to_sp(self, vests):
return vests / 1e6 * self.steem_per_mvests()
我们可以看到 steem_per_mvests 实际上会调用 steemd 去区块链上取数据.
实际上这个数值我们并不需要实时的精确, 并且这个数值也不会变化太剧烈, 所以我们只要把 self.steem_per_mvests() 这个数值缓存起, 然后定期更新它就可以. 重写一下这个缓存版本的 vests_to_sp
import os
def file_get_contents(filename):
with open(filename) as f:
return f.read()
def vests_to_sp(vests):
steem_per_mvests = 489.85031585637665
fname = "cache/steem_per_mvests.txt"
try:
if os.path.isfile(fname):
x = file_get_contents(fname).strip()
if len(x) > 1:
x = float(x)
if x > 0:
steem_per_mvests = x
except:
pass
return vests / 1e6 * steem_per_mvests
我们需要一个更新脚本 update_steem_per_mvests.py 用于定期的却STEEM区块链上取数据然后写入 steem_per_mvests.txt
from steem.converter import Converter
from steem import Steem
from nodes import steem_nodes
def file_put_contents(filename, data):
with open(filename, 'w') as f:
f.write(data)
steem = Steem(nodes = steem_nodes)
converter = Converter(steemd_instance = steem)
x = converter.steem_per_mvests()
file_put_contents('cache/steem_per_mvests.txt', str(x))
最后面只需要放在 crontab 定时执行即可(频率可以根据需要调整)
@hourly python3 update_steem_per_mvests.py > /dev/null 2>&1
在软件设计的时候, 我们尽可能的不要去区块链实时的取数据, 因为这样性能很低, 相反, 我们把那些不是非常需要100%精确的数据缓存起来, 然后异步的去更新, 这样整体性能就能反应快许多, 更加的 responsive.
YY的点赞机器人每次都会去取YY银行股东的名单, 这并不需要实时的准确, 所以, 只需要通过另一脚本定期(每隔几分钟)跑一次, 把名单写在本地文件里, 需要的时候瞬间就能返回数据, 大大的减少了机器人跑一次的时间.
英文: Improve Performance using Asynchronous Design (SteemIt)
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK
