如何在线程中使用 telethon

2024-04-07

我想在后台运行一个函数。所以我在我的代码中使用线程。

但返回错误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

1) python脚本默认在主线程中运行。如果您使用生成一个新线程threading.Thread,这将创建一个与主线程分开运行的新线程。当我开始学习线程时,我花了很多时间阅读,然后才开始了解它。官方线程文档 https://docs.python.org/3/library/threading.html基本功能都不错,我喜欢本教程 https://realpython.com/intro-to-python-threading/进行更深入的研究。

2)Telethon的内部依赖于asyncio。在 asyncio 中,每个线程都需要自己的异步事件循环,因此生成的线程需要显式创建的事件循环。与线程一样,asyncio 是一个很大的主题,其中一些内容在马拉松文档 https://telethon.readthedocs.io/en/latest/concepts/asyncio.html.

像这样的东西应该有效:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在线程中使用 telethon 的相关文章

随机推荐

  • Chocolatey的正确使用(包更新/版本管理)

    注意 这个问题对于 Chocolatey 0 9 8 及以下版本有效 后来的版本从PowerShell脚本完全重写为C 应用程序 并且包管理的整个过程得到了很大的改进 我一直在使用巧克力味一段时间了 一开始我很兴奋 但过了一段时间我不确定它
  • 收到无效的 JSON 负载。未知名称 click_action

    所以我目前正在开发一个 PWA 我现在正在与推送通知我已经能够使用以下非常简单的 JSON 结构接收后台和前台通知 message token aValidToken notification title New Content body
  • 拦截MEF中的依赖关系

    是否可以在 MEF 处理依赖项请求之前拦截 MEF 中的依赖项请求 这对于实现装饰器和高级生命周期管理非常有用 就像是 catalogue AddInterceptor
  • 如何区分“消息”更新和“回调查询”更新? (电报机器人 API)

    抱歉 如果我的问题太混乱了 我是新来的 所以欢迎任何建议 如何区分 消息 更新和 回调查询 更新 我已经成功制作了一个内联键盘 但是当我使用它时 机器人只是挂起 他没有回复任何内容 我做了一些研究发现这个问题 https stackover
  • 错误:解析 XML 时出错:格式不正确(令牌无效)...?

    我正在开发一个具有以下 XML 的应用程序 但是当我尝试清理 构建我的项目时 会发生以下错误 错误 解析 XML 时出错 格式不正确 令牌无效
  • 检测控制台应用程序中的按键?

    我需要在控制台应用程序中检测按键 而不提示用户 基本上 我的应用程序通常是一个监听特殊输入设备的守护进程 但我需要在交互模式下使用键盘在开发盒上模拟它 我怎样才能做到这一点 我在 Linux 系统上 如果您在等待输入时无法阻塞 那么您可以使
  • 如何识别 Openoffice Calc 中两列中的重复值

    我有两列 其中有数字 当另一个人有重复的数字时 另一个人只拥有一次该数字 这些列中的数字不匹配 我需要找到 B 列中与 A 列中匹配的所有数字 这可能更好地解释了它 A B 1 2 2 2 4 5 6 5 7 6 8 6 我想得到这样的结果
  • 防止对 Web 应用程序的字典攻击

    防止字典攻击的最佳方法是什么 我已经想到了几种实现方式 但它们似乎都存在一些缺陷 X 次登录尝试失败后锁定用户 问题 很容易变成拒绝服务攻击 在短时间内锁定许多用户 逐渐增加用户名每次登录尝试失败的响应时间 问题 字典攻击可能使用相同的密码
  • 如何从指令获取角度视图层次结构?

    角度版本 6 我正在研究一个可以放置在任何元素上的指令 以用于一般使用日志记录 对于上下文 它看起来类似于以下内容 Directive selector log export class LogDirective Input log str
  • 替换 Woocommerce 3.4 中的 woocommerce_add_order_item_meta 挂钩

    我有自定义代码使用 woocommerce add order item meta 挂钩 但 woocommerce 3 4 0 显示错误日志 自版本 3 0 0 起 woocommerce add order item meta 已弃用
  • StoreKit 的 SKStoreProductViewController 在导航栏和视图之间留有空间?

    我有 UIViewController 的子类 它显示SKStoreProductViewController 该视图控制器最初是为 iOS 5 创建的 不使用自动布局 我的问题是 当SKStoreProductViewController
  • Phonegap:在 Android 中调整键盘显示上的 webview 大小

    我有一个类似的模态 有固定定位 Facebook 在最新的 Android 版本中对 Messenger 中的 feed chat 中的评论有何评论 我想要的看起来类似于 因此 当您专注于输入时 键盘会打开并缩小网络视图 默认情况下它不起作
  • 如何检查 YouTube 上是否存在某个频道?

    如果我做一个curl请求此网址 https www googleapis com youtube v3 channels part snippet 2CcontentDetails 2Cstatistics id UC x5XG1OVP6u
  • 将唯一 ID 实现为 UUID 并将其保存在 Keychain 中

    我的应用程序中需要唯一 ID 我知道 我们不能再使用 UDID 因此根据我的研究 使用 UUID 作为设备唯一 ID 并将其保存在钥匙串中将确保即使用户重新安装我的应用程序 唯一 ID 仍保持不变 我从 stackoverflow 上类似问
  • Perl 正则表达式中缺少最后一个字符

    记录小狗 记录需求 log s log 它的工作原理是在末尾 s 处缺少字符 如下所示 狗 需要 log s log 你不需要否定
  • OAuth 2.0 中的客户端密钥

    要使用 google Drive api 我必须使用 OAuth2 0 进行身份验证 我对此有一些疑问 客户端 ID 和客户端密钥用于识别我的应用程序是什么 但如果是客户端应用程序 则必须对它们进行硬编码 所以 每个人都可以反编译我的应用程
  • Linearlayout 中的背景图像

    我正在为我正在使用的线性布局的背景设置图像 我遇到的问题是标题栏下方的白色边框 如果我将背景设置为某种颜色 则不会出现白色边框 有谁知道可能是什么原因造成的 我正在动态加载一些内容 但这是 xml
  • FFmpeg RTP 流媒体错误 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想通过 FFmpeg 播放视频文件 但出现此错误 RTP 复用器仅支持一种流 当我写这个时 我得到了这个错误 ffmpeg exe i SomeVi
  • 如何在二维数组中找到北、东、南、西和对角邻居?

    我正在开发一个 2D 程序生成的 Unity 游戏 我想知道如何获得四个基本方向 N E S W 以及四个基本方向 NE SE 西南 西北 我想要实现的目标的示例 如果我们将单元格坐标视为row and column 您可以通过查看我们正在
  • 如何在线程中使用 telethon

    我想在后台运行一个函数 所以我在我的代码中使用线程 但返回错误ValueError signal only works in main thread并且不知道两件事 主线程是什么 如何解决这个问题呢 views py def callbac