作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在后台运行一个函数。所以我在我的代码中使用线程。
但返回错误 ValueError: signal only works in main thread
并且不知道两件事:
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"),
]
跟踪
[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
最佳答案
1) 默认情况下,python 脚本在主线程中运行。如果您使用 threading.Thread
生成一个新线程,这将创建一个独立于主线程运行的新线程。当我开始学习线程时,我花了很多时间阅读它才开始点击。官方threading docs基本功能都不错,我喜欢 this tutorial进行更深入的研究。
2) Telethon 的内部依赖于 asyncio。在 asyncio 中,每个线程都需要自己的异步事件循环,因此生成的线程需要一个显式创建的事件循环。与线程一样,asyncio 是一个很大的主题,Telethon docs 中涵盖了其中一些主题。 .
像这样的东西应该可以工作:
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
关于python - 如何在线程中使用 telethon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48225473/
我是一名优秀的程序员,十分优秀!