问题标签 [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.

0 投票
0 回答
124 浏览

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. 线程 1 和 2 几乎同时调用get_or_create_with_func
  2. 他们都尝试通过obj.objects.create
  3. 假设线程 1 成功创建了它。然后它退出 try/except 块,然后执行func_to_call.
  4. 线程 2 也尝试创建对象。
  5. 理想情况下,线程 2 将遇到IntegrityError.
  6. 线程 1 完成调用func_to_call,它不会引发异常。
  7. 线程 2 “提交”(并且线程 1 也已经完成提交),因此它可以调用get,并按预期获取线程 1 写入的 DB 对象。

或者

  1. 线程 1 调用func_to_call 并引发异常
  2. 线程 1 导致 django 回滚事务,因此 DB 条目不存在。
  3. 线程 2 应该仍会遇到IntegrityError,但现在调用get不会返回任何对象,因为线程 1 回滚了事务。

我的问题是,在第 4 步,create由于表上的唯一约束而失败,还是会因为线程 1 尚未实际提交事务(假设func_to_call相当慢)而通过?

0 投票
2 回答
3069 浏览

python - 我可以在记录时为 gevent greenlet 设置显示的自定义名称吗?

当我使用标准包从 greenlets 中打印出日志语句时logging,我得到如下所示的文本:

我指的是那11396-Dummy-2部分。例如,我希望它改为说“Main”或“Listener 1”之类的东西。这可能吗?从当前的文档中,我看不到任何 API 可以这样做。

0 投票
3 回答
568 浏览

python - 将多处理队列/字典/等传递给绿色线程

将多处理对象(队列、字典等)传递给多个 gevent 线程是否安全?由于它们实际上并没有同时运行,所以我认为没有问题。但是,我知道 gevent 不应该与多处理特别兼容。

0 投票
1 回答
1312 浏览

python - 如何在与主程序不同的线程中编写套接字服务器(使用 gevent)?

我正在开发一个 Flask/gevent WSGIserver 网络服务器,它需要使用 XML 通过两个套接字与硬件设备进行通信(在后台)。

一个套接字由客户端(我的应用程序)启动,我可以向设备发送 XML 命令。设备在不同的端口上应答并发回我的应用程序必须确认的信息。所以我的应用程序必须监听第二个端口。

到目前为止,我已经发出命令,打开第二个端口作为服务器,等待设备的响应并关闭第二个端口。

问题是设备可能会发送多个我必须确认的响应。所以我的解决方案是保持端口打开并继续响应传入的请求。但是,最终设备完成发送请求,而我的应用程序仍在侦听(我不知道设备何时完成),从而阻塞了其他所有内容。

这似乎是一个完美的线程用例,因此我的应用程序在单独的线程中启动了一个监听服务器。因为我已经在使用 gevent 作为 Flask 的 WSGI 服务器,所以我可以使用 greenlets。

问题是,我已经寻找了一个很好的例子,但我能找到的只是单个套接字服务器的多线程处理程序的例子。我不需要处理套接字服务器上的大量连接,但我需要在单独的线程中启动它,以便它可以侦听和处理传入消息,而我的主程序可以继续发送消息。我遇到的第二个问题是在服务器中,我需要使用“主”类中的一些方法。作为 Python 的新手,我不确定如何以某种方式构建它以使其成为可能。

这就是(在全球范围内,我忽略了敏感信息)我现在正在做的事情。如您所见,一切都是顺序的。如果有人可以在单独的线程中提供监听服务器的示例(最好使用greenlets)以及从监听服务器返回到生成线程的通信方式,那将有很大帮助。

谢谢。

编辑: 尝试了几种方法后,我决定使用 Python 的默认select()方法来解决这个问题。这行得通,所以我关于线程使用的问题不再相关。感谢为您的时间和精力提供意见的人。

0 投票
0 回答
446 浏览

python - 如果产生的线程多于池大小,为什么 gevent 池会中断?

我希望下面的代码使用 10 个并发线程并在池释放时完成其余的。相反,额外的调用会导致线程崩溃,就好像即使 urllib 请求没有成功,被调用的函数也试图继续。但为什么?我认为在游泳池为绿灯打开之前不会调用整个函数。或者即使该函数被提前调用,是什么阻止了它完成?

FWIW:workrow 函数(未显示)获取列表(CSV 的一行),在 Web 上发出 API 请求,解析 JSON,然后在另一个 CSV 中写入一行。

错误:

0 投票
0 回答
1345 浏览

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 很好地配合使用?

0 投票
2 回答
1648 浏览

python - Gevent:在每次 for 循环迭代中让出是一种好习惯吗?

我来自 Node.js,其中https://github.com/caolan/async等库允许在不阻塞事件循环的情况下异步迭代数组。

我是否正确,可以通过调用sleep(0)每个循环迭代来完成与 Gevent 相同的操作?

在解析 db 查询或 Python 代码(不是 IO 操作)的阻塞时间可以忽略不计时,这对于 Web 服务器是否真的有必要?

0 投票
1 回答
416 浏览

gunicorn - 使用 gevent socketio 时连接太多

使用 gevent socketio 时,我得到了太多的连接 (1040)。我现在正在使用猴子补丁。我可以限制创建的线程(greenlets)的数量并让一些作业共享线程吗?我正在使用 gunicorn 和 django。

0 投票
1 回答
3320 浏览

python - Python gevent pool.join() 永远等待

我有这样的功能

pool.free_count()输出值 10。

我曾经pdb追踪过。程序运行良好,直到pool.spawn()循环。

但它永远在pool.join()排队等候。

有人可以告诉我有什么问题吗?

0 投票
1 回答
658 浏览

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 错误:

代替:

有没有办法使用猴子补丁而不会出现此错误?如果我忘记提供有关问题定义的任何信息,请告诉我,我会立即更新

这是我的守护服务器代码: