当使用--pool = eventlet选项运行我的芹菜工作者时,我从amqplib.client_0_8.method_framing.read_method获得了很多"IOError:Socket closed"异常.我也从eventlet.hubs.hub.switch中看到了很多超时异常.
我正在使用类似于https://gist.github.com/821848的async_manage.py脚本,运行如下的工作:
./async_manage.py celeryd_detach -E --pool=eventlet --concurrency=120 --logfile=<path>
Run Code Online (Sandbox Code Playgroud)
这是一个已知问题,还是我的配置或设置有问题?
我正在运行djcelery 2.2.4,Django 1.3和eventlet 0.9.15.
当我听说多线程编程时,我想到了加速我的程序的机会,但事实并非如此?
import eventlet
from eventlet.green import socket
from iptools import IpRangeList
class Scanner(object):
def __init__(self, ip_range, port_range, workers_num):
self.workers_num = workers_num or 1000
self.ip_range = self._get_ip_range(ip_range)
self.port_range = self._get_port_range(port_range)
self.scaned_range = self._get_scaned_range()
def _get_ip_range(self, ip_range):
return [ip for ip in IpRangeList(ip_range)]
def _get_port_range(self, port_range):
return [r for r in range(*port_range)]
def _get_scaned_range(self):
for ip in self.ip_range:
for port in self.port_range:
yield (ip, port)
def scan(self, address):
try:
return bool(socket.create_connection(address))
except:
return False
def run(self):
pool = eventlet.GreenPool(self.workers_num)
for status in …
Run Code Online (Sandbox Code Playgroud) 我正在为数据分析任务编写Web UI.
这是它应该工作的方式:
在用户指定像dataset
和之类的参数后learning rate
,我创建了一个新的task record
,然后异步启动此任务的执行程序(执行程序可能需要很长时间才能运行.),并且用户被重定向到其他页面.
搜索完之后async library for python
,我开始了eventlet
,这是我在flask
视图函数中写的内容:
db.save(task)
eventlet.spawn(executor, task)
return redirect("/show_tasks")
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,执行程序根本不执行.
我的代码可能有什么问题?或许我应该尝试其他的东西?
我们正在运行一个服务器上的事件绿线程和猴子修补一切.我需要定期检查实现wait循环,我想把睡眠放在里面.
之间有什么区别:
eventlet.greenthread.sleep(1) AND time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
在猴子修补的环境?我想知道猴子补丁是否处理time.sleep
此代码不打印任何内容:
def foo(i):
print i
def main():
pool = eventlet.GreenPool(size=100)
for i in xrange(100):
pool.spawn_n(foo, i)
while True:
pass
Run Code Online (Sandbox Code Playgroud)
但是此代码显示数字:
def foo(i):
print i
def main():
pool = eventlet.GreenPool(size=100)
for i in xrange(100):
pool.spawn_n(foo, i)
pool.waitall()
while True:
pass
Run Code Online (Sandbox Code Playgroud)
唯一的区别是pool.waitall()
。在我看来,waitall()
意味着要等到池中的所有绿色线程都完成工作后才开始,但是无限循环会等待每个绿色线程,因此pool.waitall()
没有必要。
那么为什么会这样呢?
参考:http : //eventlet.net/doc/modules/greenpool.html#eventlet.greenpool.GreenPool.waitall
我试图了解eventlet.tpool的作用。文档说tpool.execute()允许您使用阻塞函数并在新线程中运行它。但是,tpool.execute()方法本身会阻塞,直到线程完成!那么这可能有用吗?如果我有一些阻塞/长时间运行的函数myfunc()并直接调用它,它将阻塞。如果我在tpool.execute(myfunc)内部调用它,则tpool.execute(myfunc)调用将阻塞。到底有什么区别?
我唯一能猜到的是,当直接调用myfunc()时,它不仅会阻止此协程,而且还会阻止其他协程运行,而调用tpool.execute()会阻止当前协程,但会以某种方式屈服,以便其他协程可以跑。是这样吗 否则,我看不出tpool如何有用。
我已经开始使用带有Eventlet的Python中的Flask SocketIO进行大量工作,并且正在寻找一种处理并发请求/线程的解决方案.我已经看到gevent可以实现,但是如果我使用eventlet怎么办呢?
我无法在生产系统上导入eventlet。就是说没有名为dnskeybase的模块。
# python scraper.py
Traceback (most recent call last):
File "scraper.py", line 7, in <module>
import eventlet
File "/usr/lib/python2.7/site-packages/eventlet/__init__.py", line 10, in <module>
from eventlet import convenience
File "/usr/lib/python2.7/site-packages/eventlet/convenience.py", line 7, in <module>
from eventlet.green import socket
File "/usr/lib/python2.7/site-packages/eventlet/green/socket.py", line 21, in <module>
from eventlet.support import greendns
File "/usr/lib/python2.7/site-packages/eventlet/support/greendns.py", line 67, in <module>
setattr(dns.rdtypes, pkg, import_patched('dns.rdtypes.' + pkg))
File "/usr/lib/python2.7/site-packages/eventlet/support/greendns.py", line 59, in import_patched
return patcher.import_patched(module_name, **modules)
File "/usr/lib/python2.7/site-packages/eventlet/patcher.py", line 120, in import_patched
*additional_modules + tuple(kw_additional_modules.items()))
File "/usr/lib/python2.7/site-packages/eventlet/patcher.py", line 94, …
Run Code Online (Sandbox Code Playgroud) Python新手来了。
我使用 eventlet 和 urllib2 发出大量异步 http 请求。在我的文件顶部有
import eventlet
import urllib
from eventlet.green import urllib2
Run Code Online (Sandbox Code Playgroud)
然后我发出了很多异步 http 请求,并通过这一行成功:
conn = urllib2.urlopen(signed_url, None)
Run Code Online (Sandbox Code Playgroud)
突然间,我收到这个错误:
URLError: <urlopen error [Errno 8] nodename nor servname provided, or not known>
Run Code Online (Sandbox Code Playgroud)
这个错误发生在同一个 urllib2.urlopen 行上,这很奇怪,因为它之前成功过很多次。另外,当我打印signed_url 然后将其粘贴到浏览器时,我会得到正确的响应,因此该url 的格式正确。
我已经浏览过帖子,但找不到合适的调试策略。从概念上讲,什么可能导致此错误?您建议我如何修复它?
我正在使用Python 2.7.6。
谢谢。
我正在尝试实现这里提到的 Amazon Web Scraper 。但是,我得到了下面提到的输出。输出会重复,直到以 停止RecursionError: maximum recursion depth exceeded
。我已经尝试将 eventlet 降级到版本 0.17.4,如此处所述。此外,requests
正如您在 中看到的那样,该模块正在修补helpers.py
。
助手.py
import os
import random
from datetime import datetime
from urllib.parse import urlparse
import eventlet
requests = eventlet.import_patched('requests.__init__')
time = eventlet.import_patched('time')
import redis
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
import settings
num_requests = 0
redis = redis.StrictRedis(host=settings.redis_host, port=settings.redis_port, db=settings.redis_db)
def make_request(url, return_soup=True):
# global request building and response handling
url = format_url(url)
if "picassoRedirect" …
Run Code Online (Sandbox Code Playgroud) eventlet ×10
python ×8
python-2.7 ×2
amazon-ec2 ×1
asynchronous ×1
celery ×1
coroutine ×1
django ×1
proxy ×1
socket.io ×1
urllib2 ×1
urlopen ×1
web-scraping ×1
webserver ×1