问题标签 [greenlets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 带有外部连接的 Django 线程安全 get_or_create
假设我有一个get_or_create
符合这个答案的替换方法,除了我需要将此数据库事务与外部 API 调用结合起来(检查是否存在 S3 存储桶)。假设在数据库级别(MySQL InnoDB)存在唯一约束。我正在使用 eventlet 在多个 Gunicorn 工作进程中运行此代码。
事务的成功取决于func_to_call
成功返回(不引发异常)。如果它引发异常,显然事务将回滚。
我不确定的是,如果 2 个线程同时使用这个函数,create
仍然会将一个条目保存到数据库中(这样IntegrityError
就会引发并且get
调用返回一个对象),或者它是否必须“等待”直到func_to_call
完成?
基本上我在想象这种情况,上面的函数是这样调用的:
- 线程 1 和 2 几乎同时调用
get_or_create_with_func
。 - 他们都尝试通过
obj.objects.create
- 假设线程 1 成功创建了它。然后它退出 try/except 块,然后执行
func_to_call
. - 线程 2 也尝试创建对象。
- 理想情况下,线程 2 将遇到
IntegrityError
. - 线程 1 完成调用
func_to_call
,它不会引发异常。 - 线程 2 “提交”(并且线程 1 也已经完成提交),因此它可以调用
get
,并按预期获取线程 1 写入的 DB 对象。
或者
- 线程 1 调用
func_to_call
并引发异常。 - 线程 1 导致 django 回滚事务,因此 DB 条目不存在。
- 线程 2 应该仍会遇到
IntegrityError
,但现在调用get
不会返回任何对象,因为线程 1 回滚了事务。
我的问题是,在第 4 步,create
由于表上的唯一约束而失败,还是会因为线程 1 尚未实际提交事务(假设func_to_call
相当慢)而通过?
python - 我可以在记录时为 gevent greenlet 设置显示的自定义名称吗?
当我使用标准包从 greenlets 中打印出日志语句时logging
,我得到如下所示的文本:
我指的是那11396-Dummy-2
部分。例如,我希望它改为说“Main”或“Listener 1”之类的东西。这可能吗?从当前的文档中,我看不到任何 API 可以这样做。
python - 将多处理队列/字典/等传递给绿色线程
将多处理对象(队列、字典等)传递给多个 gevent 线程是否安全?由于它们实际上并没有同时运行,所以我认为没有问题。但是,我知道 gevent 不应该与多处理特别兼容。
python - 如何在与主程序不同的线程中编写套接字服务器(使用 gevent)?
我正在开发一个 Flask/gevent WSGIserver 网络服务器,它需要使用 XML 通过两个套接字与硬件设备进行通信(在后台)。
一个套接字由客户端(我的应用程序)启动,我可以向设备发送 XML 命令。设备在不同的端口上应答并发回我的应用程序必须确认的信息。所以我的应用程序必须监听第二个端口。
到目前为止,我已经发出命令,打开第二个端口作为服务器,等待设备的响应并关闭第二个端口。
问题是设备可能会发送多个我必须确认的响应。所以我的解决方案是保持端口打开并继续响应传入的请求。但是,最终设备完成发送请求,而我的应用程序仍在侦听(我不知道设备何时完成),从而阻塞了其他所有内容。
这似乎是一个完美的线程用例,因此我的应用程序在单独的线程中启动了一个监听服务器。因为我已经在使用 gevent 作为 Flask 的 WSGI 服务器,所以我可以使用 greenlets。
问题是,我已经寻找了一个很好的例子,但我能找到的只是单个套接字服务器的多线程处理程序的例子。我不需要处理套接字服务器上的大量连接,但我需要在单独的线程中启动它,以便它可以侦听和处理传入消息,而我的主程序可以继续发送消息。我遇到的第二个问题是在服务器中,我需要使用“主”类中的一些方法。作为 Python 的新手,我不确定如何以某种方式构建它以使其成为可能。
这就是(在全球范围内,我忽略了敏感信息)我现在正在做的事情。如您所见,一切都是顺序的。如果有人可以在单独的线程中提供监听服务器的示例(最好使用greenlets)以及从监听服务器返回到生成线程的通信方式,那将有很大帮助。
谢谢。
编辑: 尝试了几种方法后,我决定使用 Python 的默认select()方法来解决这个问题。这行得通,所以我关于线程使用的问题不再相关。感谢为您的时间和精力提供意见的人。
python - 如果产生的线程多于池大小,为什么 gevent 池会中断?
我希望下面的代码使用 10 个并发线程并在池释放时完成其余的。相反,额外的调用会导致线程崩溃,就好像即使 urllib 请求没有成功,被调用的函数也试图继续。但为什么?我认为在游泳池为绿灯打开之前不会调用整个函数。或者即使该函数被提前调用,是什么阻止了它完成?
FWIW:workrow 函数(未显示)获取列表(CSV 的一行),在 Web 上发出 API 请求,解析 JSON,然后在另一个 CSV 中写入一行。
错误:
python - 此事件已被另一个 greenlet 使用
我使用 gunicorn 17.5 和worker_class="gevent", workers=3
,我从gunicorn -c config.py my:app
. 我刚刚在我的日志中注意到以下错误
一点点搜索似乎表明我可能正在使用一些模块,这些模块在导入之前没有进行猴子修补或与 greenlet 不兼容。然而 mysql 连接器是纯 python ,所以这似乎意味着它是兼容的。并且worker_class=gevent
似乎monkey.patch_all()
在初始化时调用。可以肯定的是,我import gevent.monkey; gevent.monkey.patch_all()
在我的应用程序的第一行添加了,但它没有帮助。我注意到的最后一件事:当我 ctrl-c 我的应用程序时,我得到了这个
我在网上读到这表明在导入线程后完成了猴子补丁。考虑到我提到的上下文,知道怎么会发生这种情况吗?
如果有帮助:我的应用程序在启动时会打开一堆 mysql 连接,但我不保证它们将被专门使用——即我没有具有获取/释放语义的连接池,它们只是由传入的客户端请求随机使用。拥有某种连接池会有所帮助吗?如果是,如何确保这与 gevent/greenlets 很好地配合使用?
python - Gevent:在每次 for 循环迭代中让出是一种好习惯吗?
我来自 Node.js,其中https://github.com/caolan/async等库允许在不阻塞事件循环的情况下异步迭代数组。
我是否正确,可以通过调用sleep(0)
每个循环迭代来完成与 Gevent 相同的操作?
在解析 db 查询或 Python 代码(不是 IO 操作)的阻塞时间可以忽略不计时,这对于 Web 服务器是否真的有必要?
gunicorn - 使用 gevent socketio 时连接太多
使用 gevent socketio 时,我得到了太多的连接 (1040)。我现在正在使用猴子补丁。我可以限制创建的线程(greenlets)的数量并让一些作业共享线程吗?我正在使用 gunicorn 和 django。
python - Python gevent pool.join() 永远等待
我有这样的功能
pool.free_count()
输出值 10。
我曾经pdb
追踪过。程序运行良好,直到pool.spawn()
循环。
但它永远在pool.join()
排队等候。
有人可以告诉我有什么问题吗?
python - gevent.monkey.patch_all() 之后的 max_user_connections
我正在将 gevent-socketio v0.13.8 用于基于 django 的 Web 应用程序上的聊天应用程序。我的数据库是 MySql 并且有一个 max_user_connection = 1500 值。我的套接字服务器是用 python 守护进程守护的。我在没有猴子补丁的情况下使用套接字服务器,它运行良好,除了在 greenlet 上出现错误时,所有系统都因 SystemExit 而失败,并且无法再建立连接。解决方案是重新启动所有服务器。
但是我不想每次都重新启动服务器。最后我想出了猴子修补的想法。我不知道它是否与我的问题有关,但我希望我的套接字服务器能够运行,即使未处理的异常导致 Greenlet 上的 SystemExit 也是如此。
然后我在我的服务器启动函数中使用了 gevent.monkey.patch_all() 。这是我现在的主要问题: 3-4 次连接后,MySql 导致以下错误:
max_user_connection 变量在 mysql 服务器中设置为 1500。我认为有些东西在greenlets中创建了与数据库的新连接。
顺便说一句,我使用时不会出现 max_user_connection 错误:
代替:
有没有办法使用猴子补丁而不会出现此错误?如果我忘记提供有关问题定义的任何信息,请告诉我,我会立即更新
这是我的守护服务器代码: