Вопрос:

Как использовать телетон в потоке

python django telethon

411 просмотра

1 ответ

317 Репутация автора

Я хочу запустить функцию в фоновом режиме. поэтому я использую Threading в своем коде.

но верните ошибку ValueError: signal only works in main threadи не знаете о двух вещах:

  1. что является основным потоком
  2. Как решить эту проблему :)

views.py

def callback(update):
    print('I received', update)

def message_poll_start():
    try:
        client = TelegramClient('phone', api_id, api_hash,
            update_workers=1, spawn_read_thread=False)
        client.connect()
        client.add_update_handler(callback)
        client.idle()
    except TypeNotFoundError:
        pass

def message_poll_start_thread(request):
    t = threading.Thread(target=message_poll_start, args=(), kwargs={})
    t.setDaemon(True)
    t.start()
    return HttpResponse("message polling started")

urls.py

urlpatterns = [
    path('message_poll_start', messagemanager_views.message_poll_start_thread, name="message_poll_start"),
]

trace

[12/Jan/2018 11:24:38] "GET /messages/message_poll_start HTTP/1.1" 200 23
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 "/home/teletogram/telethogram/messagemanager/views.py", line 123, in message_poll_start
    client0.idle()
  File "/home/teletogram/.env/lib/python3.5/site-packages/telethon/telegram_bare_client.py", line 825, in idle
    signal(sig, self._signal_handler)
  File "/usr/lib/python3.5/signal.py", line 47, in signal
    handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread
Автор: Ehsan Источник Размещён: 12.01.2018 11:34

Ответы (1)


0 плюса

53 Репутация автора

1) Сценарий python запускается в основном потоке по умолчанию. Если вы создаете новый поток с помощью threading.Thread, это создаст новый поток, который запускается отдельно от основного. Когда я начал изучать многопоточность, я потратил много времени на чтение, прежде чем он начал щелкать. Официальные документы по созданию потоков хороши для базовой функциональности, и мне нравится этот урок для более глубокого погружения.

2) Внутренние части Telethon полагаются на asyncio. В asyncio каждый поток нуждается в своем собственном асинхронном цикле событий, и, таким образом, порожденные потоки нуждаются в явно созданном цикле событий. Как и многопоточность, asyncio - это большая тема, некоторые из которых описаны в документации по Telethon .

Примерно так должно работать:

import asyncio
def message_poll_start():
    try:
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        client = TelegramClient('phone', api_id, api_hash, loop=loop)
        client.connect()
        client.add_update_handler(callback)
        client.idle()
    except TypeNotFoundError:
        pass
Автор: Erock618 Размещён: 27.05.2019 07:16
Вопросы из категории :
32x32