用于高容量网页搜寻的Python线程与Gevent

时间:2018-02-04 14:02:09

标签: python multithreading concurrency python-multithreading gevent

我正在尝试决定是否应该使用gevent或threading在python中实现Web抓取的并发性。

我的程序应该能够支持大量(~1000)个并发工作者。大多数时候,工人们都在等待回来的请求。

一些指导性问题: 线程和greenlet之间究竟有什么区别?我应该在一个进程中创建的最大线程数\ greenlets是多少(关于服务器的规范)?

2 个答案:

答案 0 :(得分:0)

我认为您没有把整个事情都考虑清楚。我已经使用Gevent框架创建的Greenlets完成了一些轻量级的线程应用程序。只要您允许控件在具有适当睡眠或切换的Greenlets之间进行切换-一切都会正常进行。建议不要等待或阻止超时,请提高或退出,然后休眠(除了代码的一部分),然后再次循环,而不是阻塞或等待答复-否则,您将不会轻易切换Greenlets。

另外,请小心加入和/或杀死所有Greenlets,因为您最终可能会导致造成不必要的大量后果的僵尸。

但是,我不建议您将其用于您的应用程序。而是,以下使用Gevent的Websockets扩展之一...请参阅此链接

Websockets in Flask

和此链接

https://www.shanelynn.ie/asynchronous-updates-to-a-webpage-with-flask-and-socket-io/

我已经用Flask-SocketIO实现了一个非常不错的应用

https://flask-socketio.readthedocs.io/en/latest/

它很好地通过Docker容器与Nginx一起在Gunicorn中运行。 SocketIO在客户端与Javascript的接口非常好。

(请谨慎进行网络抓取-使用诸如Scrapy之类的方法并启用适当的道德抓取行为)

答案 1 :(得分:0)

python线程是由OS控制的OS线程,这意味着它很重,因为它需要上下文切换,但是绿色线程是轻量级的,并且由于它位于用户空间中,因此OS不会创建或管理它们。 我认为您可以使用geventGevent = eventloop(libev) + coroutine(greenlet) + monkey patch,Gevent可以为您提供线程,但无需使用线程即可编写普通代码但具有异步IO。 确保您的代码中没有与CPU绑定的内容。