问题标签 [eventlet]
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.
python - 用于UDP发送/接收服务器的python AsyncIO?
有人可以推荐一个使用 python 和 eventlet 来处理简单但快速的 UDP 接收/确认服务器的框架吗?
注意:我不想使用twisted。
python - 使用 Eventlet 从 WSGI 应用程序获取客户端 IP 地址
我目前正在编写一个基于 Python Eventlet 库 (http://eventlet.net/doc/) 的基本调度模型服务器。查看了 Eventlet 上的 WSGI 文档(http://eventlet.net/doc/modules/wsgi.html),我可以看到 eventlet.wsgi.server 函数除了客户端之外还记录了 x-forwarded-for 标头IP地址。
但是,获得这个的方法是附加一个类似文件的对象(默认为 sys.stderr),然后让服务器将其连接到该对象。
我希望能够从应用程序本身(即具有 start_response 和 environ 作为参数的函数)中获取客户端 IP。事实上,环境键将是完美的。有没有办法简单地获取 IP 地址(即通过环境字典或类似的),而不必以某种方式重定向日志对象?
python - eventlet 可以通过异步传入和传出的消息来管理 AMQP 连接吗?
实际设计:
对于那些回到这个问题的人,下面的有用答案将我推向了一个运行良好的可行设计。三个见解是关键:
- Eventlet 是一个非常安全的环境——如果两个 greenlet 都尝试
recv()
或同时尝试send()
从同一个套接字,那么 Eventlet 优雅地杀死第二个 greenlet 并出现异常。这很棒,意味着如果amqplib
“果岭”不佳,将导致简单的异常,而不是不可能重现的数据交错错误。 - 这些
amqplib
方法大致分为两组:在AMQP 消息组装之前wait()
在内部循环,而其他方法返回消息并且不会尝试自己的方法。考虑到作者不知道有人会尝试“绿化”他们的库,这真是太幸运了!这意味着消息发送不仅对 调用的回调是安全的,而且还可以从完全不受循环控制的其他 greenlet 安全地发送消息。这些安全方法——可以从任何greenlet调用,而不仅仅是从回调中调用——是:recv()
send()
recv()
amqplib
wait()
wait()
wait()
basic_ack
basic_consume
和nowait=True
basic_publish
basic_recover
basic_reject
exchange_declare
和nowait=True
exchange_delete
和nowait=True
queue_bind
和nowait=True
queue_unbind
和nowait=True
queue_declare
和nowait=True
queue_delete
和nowait=True
queue_purge
和nowait=True
- 信号量可以用作锁:用计数初始化信号量,
1
然后用acquire()
和release()
来锁定和解锁。我所有想要编写消息的异步 greenlet 都可以使用这样的锁来避免它们的单独send()
调用交错并破坏 AMQP 协议。
所以我的代码大致是这样的:
享受!
原始问题:
想象一下,每分钟有数百条 AMQP 消息到达一个小型 Python Eventlet应用程序,每条消息都需要处理和回答——其中处理的 CPU 开销最小,但可能需要等待来自其他服务和套接字的回答。
例如,为了允许一次处理 100 条消息,我当然可以启动 100 个到 RabbitMQ 的单独 TCP 连接,并为每个连接设置一个工作程序,以同步接收、处理和回答单个消息。但是为了节省 TCP 连接,我宁愿只创建一个 AMQP 连接,允许 RabbitMQ 将消息全速流向我的管道,将这些任务交给工作人员,并在每个工作人员完成时发回答案:
请注意:
- Eventlet队列可以优雅地在工作人员之间分配传入的工作,因为他们可以进行更多工作。
- 来自 RabbitMQ 的流控制甚至可能是可能的:我只能在我的工作人员都忙之前 ACK 消息,然后在发送进一步的 ACK 之前等待,直到队列开始为空。
- 工作几乎肯定会乱序完成:一个请求可能很快完成,而另一个较早到达的事件需要更长的时间;有些请求可能永远不会完成;因此工作人员将以不可预测的异步顺序返回响应。
在看到这篇关于 AMQP 库可以多么容易地被拉入 Eventlet 处理模型的有吸引力的博客文章后,我一直计划使用 Eventlet 和py-amqplib编写这个:
http://blog.eventlet.net/2010/02/09/multiple-concurrent-connections-with-py-amqplib-and-eventlet/
我的问题是,在阅读了这两个库的文档、amqplib 源代码和大部分 Eventlet 源代码后,我无法弄清楚如何教授拥有 AMQP 连接的 eventlet——connect_to_host()
博客文章中命名的 eventlet——当工作人员完成工作并生成答案时也会醒来。amqplib 中的wait()
方法只能通过 AMQP 套接字上的活动来唤醒。虽然感觉我应该能够让工作人员将他们的答案写入队列,并在新的传入消息到达或connect_to_host()
工作人员准备好发送答案时唤醒 eventlet ,但我找不到任何方法让一个小事件说“当任何一个时叫醒我这些事情都会发生。”</p>
我确实想到,工作人员可以尝试控制 AMQP 连接对象——甚至是原始套接字——并通过 TCP 写回他们自己的消息;但似乎有必要使用锁来防止传出的工作消息相互交错或与主侦听器 eventlet 编写的 ACK 消息交错,而且我也找不到在 Eventlet 中可用的锁。
所有这一切让我几乎可以肯定,我正试图以某种方式完全倒退来解决这个问题。像这样的问题——让一个单一的连接在侦听器-调度程序和许多工作人员之间安全地共享——根本不映射到协程模型,并且需要一个成熟的异步库吗?(在这种情况下:你会为这个问题推荐一个,以及如何在传入消息和传出工作人员响应之间进行多路复用?我今天早些时候没有找到干净的解决方案,尝试像 Pika + ioloop 这样的组合——尽管我刚刚看到了另一个库,stormed_amqp,它可能比 Pika 做得更好。)或者如果我想要可以制定这个模型的干净和可维护的代码,我是否真的需要依赖真正的实时 Python 线程?我对所有选择持开放态度。
感谢您的任何帮助或想法!我一直在想,我已经把 Python 中的整个并发问题搞得差不多了,然后我又一次知道我没有。:) 无论如何,我希望你喜欢上面的 ASCII 艺术。
python - 小事件和 SMTP
我想多线程发送邮件(使用 django 的 SMTPConnection 或者可能是 smtplib 模块)。我希望有一个类似于 urllib2 的模块,我可以:
除了使用 smtplib 而不是 urllib2 导入。但是,这似乎支持。我读到这可能是猴子补丁(?),但我不确定如何继续。有什么想法可以通过 eventlet 来实现吗?或者我是否必须进入 python Thread 类等。
node.js - 当这些非阻塞 I/O 服务器的单个请求需要很长时间时会发生什么?
使用 Node.js 或 eventlet 或任何其他非阻塞服务器,当给定请求需要很长时间时会发生什么,它会阻塞所有其他请求吗?
例如,一个请求进来,计算需要 200 毫秒,这将阻塞其他请求,因为例如 nodejs 使用单个线程。
这意味着您的每秒 15K 将大幅下降,因为计算给定请求的响应所需的实际时间。
但这对我来说似乎是错误的,所以我在问真正发生了什么,因为我无法想象事情是如何运作的。
python - python greenlet分段错误
我将 ubuntu 11.10 与 Python 2.7.2 一起使用我尝试使用 eventlet 或 Concurrence,但简单的示例因“分段错误”而失败我读到这是一个 greenlet 问题,但不知道如何解决这个问题?请帮忙。
python - 了解 eventlet.wsgi.server
我有这个简单的 Python 程序:
因此,当我运行它并http://localhost:8090/
在我的浏览器上多次打开时,got request
仅在第一个请求已处理后(10 秒后)才打印。似乎eventlet.wsgi.server
正在同步处理请求。但我使用的是“绿色” sleep
。怎么会这样?
谢谢!
python - pyftpdlib 对文件的慢速读取会阻塞整个主循环
你好,
我正在使用自定义将 HTTP 服务器AbstractFS
上pyftpdlib
的文件映射到 FTP。这些文件由我的open
(of AbstractFS
) 实现返回,它返回httplib.HTTPResponse
由以下类包装的:
问题是,如果客户端正在下载文件,整个服务器就会变得迟缓。我能做些什么?有任何想法吗?
PS:为什么只是用猴子修补所有东西并evenetlet
不能神奇地让一切正常工作?
python - 将 couchdbkit 与 gunicorn 和 eventlet 一起使用时出现 NoMoreData 异常
希望有人能够对我遇到的这个问题有所了解。
我在金字塔 webapp 中使用 couchdbkit。我的服务器是带有 eventlet 工作人员的 gunicorn。
我正在为 couchdbkit 使用 eventlet 管理器。
当我的应用程序运行时,我经常从 couchdbkit(实际上是 restkit 中的 http 解析器)收到 NoMoreData 异常。我的预感是,这与等待事件的一个连接有关,它正在获取不同等待连接的数据,但我不确定。
有没有人遇到过这个问题?你有想法吗?
谢谢, 雷舍夫
python - 使用 eventlet.monkey_patch() 时如何制作非阻塞 raw_input 以及为什么它会阻塞所有内容,即使在另一个线程上执行也是如此?
我写了这个最低限度的代码来解释我的情况:
即使我有 2 个线程,当我调用 raw_input 时它们都被阻塞了。当我注释掉 eventlet.monkey_patch() 时,只有一个线程被阻塞,另一个线程继续打印“打印”。为什么以及我应该怎么做?