我有一个用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?谢谢。
答案 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()