我正在尝试决定是否应该使用gevent或threading在python中实现Web抓取的并发性。
我的程序应该能够支持大量(~1000)个并发工作者。大多数时候,工人们都在等待回来的请求。
一些指导性问题: 线程和greenlet之间究竟有什么区别?我应该在一个进程中创建的最大线程数\ greenlets是多少(关于服务器的规范)?
答案 0 :(得分:0)
我认为您没有把整个事情都考虑清楚。我已经使用Gevent框架创建的Greenlets完成了一些轻量级的线程应用程序。只要您允许控件在具有适当睡眠或切换的Greenlets之间进行切换-一切都会正常进行。建议不要等待或阻止超时,请提高或退出,然后休眠(除了代码的一部分),然后再次循环,而不是阻塞或等待答复-否则,您将不会轻易切换Greenlets。
另外,请小心加入和/或杀死所有Greenlets,因为您最终可能会导致造成不必要的大量后果的僵尸。
但是,我不建议您将其用于您的应用程序。而是,以下使用Gevent的Websockets扩展之一...请参阅此链接
和此链接
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不会创建或管理它们。
我认为您可以使用gevent
,Gevent = eventloop(libev) + coroutine(greenlet) + monkey patch
,Gevent可以为您提供线程,但无需使用线程即可编写普通代码但具有异步IO。
确保您的代码中没有与CPU绑定的内容。