У меня есть круговая диаграмма, которая запрашивает данные из очереди SQS с интервалом 60 секунд. Круговая диаграмма также удаляет только что полученное сообщение, чтобы поддерживать чистоту очереди и предотвращать дублирование. Очередь SQS отправляет новое сообщение каждые 40i sh секунд, а очередь SQS является стандартной, а не FIFO. Существует также линейный график, который отображает настроения Twitter в реальном времени, обновляемые с интервалом в каждую секунду, а также панель поиска, которая позволяет пользователю искать термин (например, covid, biden, trump и т. Д. c.) И отображает тональность этого термина на линейном графике. Каждый вводимый пользователем символ обновляет страницу с момента запроса к базе данных. Например, если вы введете термин covid, он будет искать «c», затем «co», затем «cov» и т. Д.
Я столкнулся с проблемой, что когда пользователь вводит термин , страница обновляется при каждом вводе символа. Это подходит для линейного графика настроений в реальном времени, но не для круговой диаграммы. Когда страница обновляется, запускается функция круговой диаграммы, а это означает, что она опрашивает очередь и удаляет сообщение. Поэтому, если кто-то наберет трехзначный термин, например «автомобиль», функция круговой диаграммы будет активирована три раза и попытается получить / удалить три сообщения. Поскольку у меня соотношение сообщения, отправляемого в очередь, к интервалу обновления круговой диаграммы установлено на 1: 1, на круговой диаграмме не будет сообщений для опроса.
Есть ли способ в da sh -сюжет, чтобы заморозить конкретный график c, когда пользователь вводит данные в строку поиска? Или функция не запускается, когда что-то набирается в строке поиска?
Это мой код для круговой диаграммы и ее функции обновления:
def get_message():
sqs = boto3.client('sqs', aws_access_key_id=os.environ.get("accesskeyid"),
aws_secret_access_key=os.environ.get("secretaccesskey"),
region_name=os.environ.get("region"))
while True:
resp = sqs.receive_message(
QueueUrl=os.environ.get("queue_url"),
AttributeNames=['All'],
MaxNumberOfMessages=1
)
try:
data = []
messages = resp['Messages']
message = messages[0]
string_body_dictionary = message['Body']
body_dictionary = json.loads(string_body_dictionary)
string_message_dictionary = body_dictionary.get('Message')
sentiment_dictionary = json.loads(string_message_dictionary)
positive = sentiment_dictionary.get('Positive')
negative = sentiment_dictionary.get('Negative')
neutral = sentiment_dictionary.get('Neutral')
data.append(positive)
data.append(negative)
data.append(neutral)
entries = [
{'Id': msg['MessageId'], 'ReceiptHandle': msg['ReceiptHandle']}
for msg in resp['Messages']
]
resp = sqs.delete_message_batch(
QueueUrl=os.environ.get("queue_url"), Entries=entries
)
if len(resp['Successful']) != len(entries):
raise RuntimeError(
f"Failed to delete messages: entries={entries!r} resp={resp!r}"
)
return data
except KeyError:
break
# @app.callback(Output('pie', 'figure'),
# [Input('pie-update', 'n_intervals')])
@app.callback(Output('pie', 'figure'),
[Input(component_id='sentiment_term', component_property='value')],
events=[Event('pie-update', 'interval')])
def update_pie(n):
try:
values = get_message()
labels = ['Positive', 'Negative', 'Mixed']
trace = go.Pie(labels=labels, values=values, title="Distribution of Twitter Sentiement",
hoverinfo='label+percent', textinfo='value',
textfont=dict(size=20, color=app_colors['text']),
marker=dict(
line=dict(color=app_colors['background'], width=2)))
return {'data': [trace], 'layout': go.Layout(title="Distribution of Twitter Sentiement",
colorway=["#5E0DAC", '#FF4F00', '#375CB1', '#FF7400',
'#FFF400',
'#FF0056'],
template='plotly_dark',
paper_bgcolor='rgba(0, 0, 0, 0)',
plot_bgcolor='rgba(0, 0, 0, 0)',
margin={'b': 15},
hovermode='x',
autosize=True)}
except Exception as e:
with open('errors.txt', 'a') as f:
f.write(str(e))
f.write('\n')