maximkv25
@maximkv25
web-developer

Почему в потоке дублируется запрос?

Есть поток, который запускается каждые 60 сек.
С этого потока формируется словарь и передается в другой поток для посыла запросов.
Проблема состоит в следующем, при выполнении scheduled_req сообщения часто дублируются,
проверил какой словарь формирует message_delayed и сравнил уже с переданным для отправки, логи ниже.

В потоки только вникаю и мало опыта, подскажите в чем причина?

def scheduled_req(send_dlist):
    from api.models import Scheduled
    print('Separate thread: ', send_dlist)
    for i in send_dlist:
        url = 'http://0.0.0.0:8080/api/v1/message/send'
        data = dict(token=send_dlist.get(i), message_id=i)
        req = requests.post(url, data=json.dumps(data))

        try:
            Scheduled.objects.create(response=req.json())
        except Exception as e:
            print(str(e))


# Theardings
def message_delayed():
    while True:
        mes = Message.objects.filter(status='scheduled').values('owner_id', 'message_id', 'timestamp')
        # получаем id сообщений которые соответствуют времени отправки
        send_dlist = {i['message_id']: get_token(i['owner_id']) for i in mes if
                      i['timestamp'] in range(round(time.time() - 60), round(time.time()))}

        print('List of messages: ', send_dlist)
        scheduled_thread = threading.Thread(name='scheduled_thread', target=scheduled_req, args=[send_dlist])
        scheduled_thread.start()
        time.sleep(60)


t = threading.Thread(name='message_delayed', target=message_delayed, daemon=True)
t.start()


Видно что список один, а запрос срабатывает 2 раза...

List of messages:  {'33_0': '9e9c0952-fd92-11e6-a095-52540010ddb4'}
Separate thread:  {'33_0': '9e9c0952-fd92-11e6-a095-52540010ddb4'}
[06/Mar/2017 10:17:01] "POST /api/v1/message/send HTTP/1.1" 200 291
[06/Mar/2017 10:17:07] "POST /api/v1/message/send HTTP/1.1" 200 291
List of messages:  {'33_1': '9e9c0952-fd92-11e6-a095-52540010ddb4'}
Separate thread:  {'33_1': '9e9c0952-fd92-11e6-a095-52540010ddb4'}
[06/Mar/2017 10:18:00] "POST /api/v1/message/send HTTP/1.1" 200 291
[06/Mar/2017 10:18:03] "POST /api/v1/message/send HTTP/1.1" 200 291


Логи цикла
[06/Mar/2017 11:11:04] "POST /api/v1/message/send HTTP/1.1" 200 291
33_0
{'response': {'tw': {'posted': '838708501492944897'}, 'vk': {'posted': '305807227_619'}, 'ok': {'posted': '66618381235599'}, 'md': {'error': {'errors': [{'code': -1, 'message': 'User has reached the rate limit for publishing today.'}]}}, 'fb': {'posted': '185652755255938_191189801368900'}}}
[06/Mar/2017 11:11:08] "POST /api/v1/message/send HTTP/1.1" 200 291
[06/Mar/2017 11:11:19] "POST /api/v1/message/send HTTP/1.1" 200 291
33_1
{'response': {'tw': {'posted': '838708561932857344'}, 'vk': {'posted': '305807227_621'}, 'ok': {'posted': '66618382742927'}, 'md': {'error': {'errors': [{'code': -1, 'message': 'User has reached the rate limit for publishing today.'}]}}, 'fb': {'posted': '185652755255938_191189951368885'}}}
[06/Mar/2017 11:11:23] "POST /api/v1/message/send HTTP/1.1" 200 291


Запись в бд
36f8fa9f146f47549c0c0f304dfaeb06.png
  • Вопрос задан
  • 464 просмотра
Решения вопроса 1
maximkv25
@maximkv25 Автор вопроса
web-developer
Проблема была в том, что я вручную генерировал сообщения, использовал manage.py shell, который в свою очередь повторно запускал главный поток.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы