Как приостановить график в Plotly-Dash - PullRequest
0 голосов
/ 14 июля 2020

У меня есть круговая диаграмма, которая запрашивает данные из очереди 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')
...