Bottle gevent 和线程:gevent 只能在单个线程中使用

2024-04-19

我有一个 python Bottle 应用程序,它使用线程。由于我正在使用猴子补丁 http://www.gevent.org/gevent.monkey.html,线程正在阻止应用程序执行(从线程触发的对话框正在阻止瓶子路由响应客户端,直到被关闭。)

这里的一些研究表明我应该使用猴子补丁而不尝试修补线程:

# Patch python's threads with greenlets
from gevent import monkey
monkey.patch_all(thread=False)

这不会阻止最小example https://stackoverflow.com/questions/16505586/python-win32api-blocking-bottle-routes我写。

但在大量使用线程时会引发这些错误,方法如下threading.setEvent()
这是我得到的错误:

C:\Users\IEUser\downloadloft-localserver>python mainserver.py
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 551, in _
_bootstrap_inner
self.run()
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 753, in r
un
self.finished.wait(self.interval)
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 403, in w
ait
self.__cond.wait(timeout)
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 262, in w
ait
_sleep(delay)
  File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p
y2.7-win32.egg.tmp\gevent\hub.py", line 79, in sleep
switch_result = get_hub().switch()
  File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p
y2.7-win32.egg.tmp\gevent\hub.py", line 135, in get_hub
raise NotImplementedError('gevent is only usable from a single thread')
NotImplementedError: gevent is only usable from a single thread

Bottle v0.12-dev server starting up (using GeventSocketIOServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 551, in _
_bootstrap_inner
self.run()
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 753, in r
un
self.finished.wait(self.interval)
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 403, in w
ait
self.__cond.wait(timeout)
  File "C:\Program Files\DownloadLoft\Python27\lib\threading.py", line 262, in w
ait
_sleep(delay)
  File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p
y2.7-win32.egg.tmp\gevent\hub.py", line 79, in sleep
switch_result = get_hub().switch()
  File "c:\users\admini~1\appdata\local\temp\easy_install-sch3hm\gevent-0.13.8-p
y2.7-win32.egg.tmp\gevent\hub.py", line 135, in get_hub
raise NotImplementedError('gevent is only usable from a single thread')
NotImplementedError: gevent is only usable from a single thread

这是 gevent.monkeypatch 的已知问题吗?有任何想法吗?


Bottle 应用程序是线程化的,因此您不能在 Bottle 路由中调用的任何函数中使用 gevent。

为了帮助你,我需要推测你为什么使用线程。

如果要加速您的 Bottle 网站,只需使用 Cherrypy 服务器:

pip install cherrypy 

(或者只是将cherrypy目录转储到当前目录中,它是一个纯Python服务器)

然后以这种方式运行你的瓶子应用程序:

bottle.run(server='cherrypy')

如果是因为您想要进行非阻塞调用(例如获取 URL)而不阻塞响应,那么手动执行此操作很容易:

  • 创建一个 Queue 对象(它是一个特殊的队列,可以在线程之间填充和弹出)。
  • 创建并运行一个带有无限 while 循环的线程,每次都会取消队列并执行操作。
  • 当需要非阻塞调用时,将操作推入队列并携带一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bottle gevent 和线程:gevent 只能在单个线程中使用 的相关文章

随机推荐

  • 终止连接到 erlang 端口的进程

    我想写一个某种主管 我正在尝试实现关闭外部程序的功能 外部进程通过端口连接到 erlang 的代码 我不知道如何通过发送信号或其他任何方式来关闭该程序 关闭端口不是解决方案 因为我已经检查过许多程序不会在 SIGPIPE 上退出 您有任何想
  • 使用 elasticsearch-dsl-py 对另一个字段中包含的字段创建术语查询

    我在用elasticsearch dsl py https github com elasticsearch elasticsearch dsl py并希望过滤包含在另一个术语中的术语 如下所示 slug foo foo slug bar
  • 如何更改Accounts-UI模板?

    根据望远镜 http demo telesc pe 例子 源代码 https github com SachaG Telescope 可以显示自定义的 account ui 表单 参见他的用户登录 html https github com
  • 是否可以为 VS Code 编写二进制文件导入扩展?

    我想在 vs code 中显示二进制文件的一些信息 是否可以为 VS Code 编写一个扩展名 以便在资源管理器中选择该文件 或直接打开它 时 您会看到该扩展名从二进制文件中提取的一些文本 因此 该扩展的核心功能将是 简化的 二进制到文本转
  • R dplyr left_join 错误

    所以我一直在尝试使用 left join 将新数据集的列获取到我的主数据集 称为员工 我已经仔细检查了矢量名称和我没有进行的清理 但似乎没有任何效果 这是我的代码 将不胜感激任何帮助 job codes lt read csv Quest
  • 如何将 Cognito 用户池与 Facebook 等外部提供商结合起来?

    到目前为止 Cognito 拥有支持 Facebook 等外部提供商的身份池 现在有 Cognito 用户池 我很想使用它 但我不知道如何同时支持 Cognito 用户池和 Facebook 等外部提供商 看来身份池和用户池是分开的东西 我
  • Android.mk 包含其他项目

    说明 我的问题的目标是了解如何创建一个可以构建和运行的 Android mk makefile 如下所示的项目结构 Library is library on eclipse 数据 项目库 Project Interface 包含 1 个静
  • Html.Action 不会呈现用 [HttpPost] 注释的操作方法

    我的控制器上有以下方法 HttpPost public ActionResult UnplannedCourses int studentId var model CreateUnplannedCourseModel studentId r
  • 如何从 jQuery UI 日期选择器获取日期

    每当用户在 jQuery UI datepicker 中选择日期并单击表单上的按钮时 我想从 datepicker 获取日期 好吧 我需要获取他们选择的日期的年月日 如何从 jQuery UI 获取日期 Use var jsDate you
  • 控制台错误“非法的base64字符20”[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用以下代码进行加密和解密 而解密时我在运行时收到错误 错误消息是 非法的 base64 字符 20 加密代码 String sec
  • 是否可以通过在 ASP.NET 中模拟 Windows 身份验证用户来从 Active Directory 检索数据?

    我一整天都在试图解决这个问题 并且我在标准谷歌留言板答案中读到了一些相互矛盾的信息 我想做的是从活动目录中检索域用户 即当前登录用户 的电子邮件地址 我的 ASP NET 4 网站设置为 Windows 身份验证 在 Active Dire
  • PHP 中变量的数组路径

    因此 我编写了一个类 它可以解析 XML 文档并从中创建 SQL 查询 以根据设置更新或插入新行 由于脚本必须处理任意数量的嵌套块 因此我放入所有值的数组的路径是动态创建的 与以下示例非常相似 path array field1 field
  • AngularJS中单向绑定和双向绑定的区别

    你能解释一下两者之间的区别吗One way Data Binding and Two way Data Binding举个例子 我们使用了哪种情况 单向数据绑定 ng bind具有单向数据绑定 Model scope gt View 例如
  • 使用 Python 查找和替换非 ascii 字符的正则表达式

    我需要将一些非 ASCII 字符更改为 例如 Tannh user gt Tannh user 如果我在 Python 中使用正则表达式 我该怎么做 有没有更好的方法来做到这一点而不使用 RE re sub r x00 x7F theStr
  • R barplot Y轴刻度太短

    我正在尝试生成条形图 但 y 轴刻度太短 这是我的代码 barplot as matrix dat log y ylim c 10000 100000000 beside TRUE ylab Number of reads col c gr
  • 使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误

    以下代码在 boost property tree read xml 调用时因段错误而崩溃 仅当在使用 boost asio spawn 生成的 io service 处理程序内部调用它时 才会发生这种情况 如果处理程序刚刚发布 则可以正常
  • Zend 覆盖默认视图对象

    如何覆盖 zend 框架中的默认视图对象 以便我可以拥有自定义视图对象 class Bootstrap extends Zend Application Bootstrap Bootstrap function initViewHelper
  • Windows 字体安装后无法立即在应用程序中使用?

    每当我在 Windows 2003 服务器上安装新字体时 我都无法立即在我的 asp net Web 应用程序中使用它 应用程序通过以下方式获取字体CreateFontIndirectgdi32 dll win api 然后使用此字体在我的
  • 有没有办法在 writetable() 中使用字符串作为分隔符 - Julia

    当使用 writetable 将数据帧写入文件时 我希望能够将分隔符设为空格然后逗号 即 作为分隔符 我知道 writetable 只能选择将单个字符作为分隔符参数 是否有可能的解决方法能够将字符串作为分隔符 或者 是否可以简单地在数据框中
  • Bottle gevent 和线程:gevent 只能在单个线程中使用

    我有一个 python Bottle 应用程序 它使用线程 由于我正在使用猴子补丁 http www gevent org gevent monkey html 线程正在阻止应用程序执行 从线程触发的对话框正在阻止瓶子路由响应客户端 直到被