LINUX.ORG.RU

Ошибка в многопоточном коде

 


0

2

Рассылка сообщений ботом подписавшимся юзерам.

используется multiprocessing

Постоянно такая ошибка:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib/python3.5/multiprocessing/pool.py", line 429, in _handle_results
    task = get()
  File "/usr/lib/python3.5/multiprocessing/connection.py", line 251, in recv
    return ForkingPickler.loads(buf.getbuffer())
TypeError: __init__() missing 2 required positional arguments: 'function_name' and 'result'


Постоянно в третьем треде, хотя треды одинаковые
Никакого намека на точное место ошибки, все в либах

Что с этим делать? Как искать?

Хм, попробовал выставить 2 потока - все равно Thread-3

★★★★★

вангую, что первый - это main. из него ты делаешь еще сколько-то. вот один нормально делается, а следующий - нет.

bvn13 ★★★★★
()
Ответ на: комментарий от Reineke

Примерно так:

import telebot
from pprint import pprint
import pymysql.cursors
import json
import decimal
from time import sleep
from datetime import datetime, timedelta
from multiprocessing import Pool, TimeoutError
import tqdm




connection1 = pymysql.connect(host='127.0.0.1',
                                     user='root',
                                     password='pass',
                                     charset='utf8',
                                     db='db',
                                     cursorclass=pymysql.cursors.DictCursor,
                                     autocommit=True)

with connection1.cursor() as cursor1:
  sql = "SELECT * FROM telegram_subscriptions WHERE chat_id IS NOT NULL AND bot_id = 1"
  cursor1.execute(sql)
  users = cursor1.fetchall()

  if len(users):

    def processInput(user):

      BOT_TOKEN = "------------------------------"
      bot = telebot.TeleBot(BOT_TOKEN)

      connection2 = pymysql.connect(host='127.0.0.1',
                                 user='root',
                                 password='pass',
                                 charset='utf8',
                                 db='db',
                                 cursorclass=pymysql.cursors.DictCursor,
                                 autocommit=True)
                                 
      with connection2.cursor() as cursor:
        sql = "SELECT * FROM table WHERE uid = %s AND activated > 0 AND sended = 0"
        cursor.execute(sql, (user['uid']))
        results = cursor.fetchall()
        # pprint(results)

        ids = []

        for res in results:
          #  Обработка данных из базы
          .......
          .......
          ........

          bot.send_message(user['chat_id'], msg)
    
          ids.append(str(res['id']))


        ids = ','.join(ids)

        if ids != "":
          sql = """UPDATE table SET sended = UNIX_TIMESTAMP() WHERE id IN ({ids})""".format(ids=ids)
          cursor.execute(sql)



    pool = Pool(processes=10)
    for _ in tqdm.tqdm(pool.imap_unordered(processInput, users), total=len(users)):
      pass

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Не уверен в правильности своих сурждений, но по идее imap_unordered вторым параметром должен получить итератор. Не знаю как в pymysql, но в sqlite, с которым приходилось работать, fetchall() возвращает список, а fetchone() - итератор. Попробуй заменить здесь users = cursor1.fetchall()

Reineke
()
Ответ на: комментарий от Reineke

Ну, я как бы со списком и работаю.

Методом тыка выявил, что затык происходит на bot.send_message(user['chat_id'], msg)
Чешу репу

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

должен получить итератор

я как бы со списком и работаю

ну мы друг-друга поняли, да.

Так что, без отправки завелось и создаёт все потоки норм или шо?

Reineke
()
Ответ на: комментарий от Reineke

Да, без отправки не падает

Причем бот точно не в бане - отправлять начинает. Но валится ровно один тред. Если тредов 10 - отправится из 9, на одном виснет

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Reineke

Кажется починил заменой telebot на обычный запрос к апи телеграма через requests

Qwentor ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.