电报机器人-功能同步阻止问题

时间:2019-02-28 17:29:27

标签: python amazon-web-services amazon-ec2 boto3 telegram-bot

我有一个用python编写的电报机器人,它使用户可以在AWS中创建EC2实例。代码如下:

# We create the new EC2 instance for the new user
instance_id, ec2 = generateInstanceForUser(user_id)

i = ec2.Instance(id=instance_id) # instance id
i.start()
i.wait_until_running()
i.load()
time.sleep(45)

# Create account in DB
createAccountDB(user_id, username, user.mail, instance_id)

# Now that the instance and the account have been created, now settings have to be updated too
updateSettings(user_id, dictChange)

问题在于功能generateInstanceForUser(user_id)阻塞了工作流以及以下5行(显然,time.sleep()函数)。最后一个功能updateSettings()通过SSH连接到刚创建的计算机并执行一些操作。在不考虑延迟的情况下,此工作流程效果很好。

但是,由于我使用的是Telegram机器人,因此在这段代码中,该机器人会在2分钟内冻结。结果,如果还有其他用户发送命令,则该机器人不会响应,这显然是不希望的。

注意:所使用的函数保存在boto3库中。

问题

您是否知道一些避免在执行给定代码期间阻塞工作流的方法,从而避免使用Telegram bot造成不良的UX?谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了答案。我只是将代码的阻塞部分封装在另一个函数中,并使用线程来创建并行线程。这样,主线程将不会阻塞,并且僵尸程序仍将继续正常工作:

import numpy as np
import matplotlib.pyplot as plt

###
# Plot heatmap in the background
###

# Setting up input values
x = np.arange(-6.0, 6.0, 0.1)
y = np.arange(-6.0, 6.0, 0.1)
X, Y = np.meshgrid(x, y)

# plot heatmap colorspace in the background
fig, ax = plt.subplots(nrows=1)
im = ax.imshow(X, cmap=plt.cm.get_cmap('RdBu'), extent=(-6, 6, -6, 6), interpolation='bilinear')
cax = fig.add_axes([0.21, 0.95, 0.6, 0.03]) # [left, bottom, width, height]
fig.colorbar(im, cax=cax, orientation='horizontal')  # add colorbar at the top

###
# Plot data as scatter
###
# generate the points
num_samples = 150
theta = np.linspace(0, 2 * np.pi, num_samples)

# generate inner points
circle_r = 2
r = circle_r * np.random.rand(num_samples)
inner_x, inner_y = r * np.cos(theta), r * np.sin(theta)

# generate outter points
circle_r = 4
r = circle_r + np.random.rand(num_samples)
outter_x, outter_y = r * np.cos(theta), r * np.sin(theta)

# plot data
ax.scatter(inner_x, inner_y, s=30, marker='o', color='royalblue', edgecolors='white', linewidths=0.8)
ax.scatter(outter_x, outter_y, s=30, marker='o', color='crimson', edgecolors='white', linewidths=0.8)
ax.set_ylim([-6,6])
ax.set_xlim([-6,6])

plt.show()