From 4ddd9b8b3eb9ce4b8d7b5383e00079383c3bb566 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20K=C3=B6gl?= Date: Thu, 22 Nov 2012 20:41:00 +0100 Subject: [PATCH] make gevent optional required for running under pypy --- mygpo/api/advanced/__init__.py | 34 +++++++++++++++++------ mygpo/core/podcasts.py | 22 +++++++++++---- mygpo/data/management/commands/feed-downloader.py | 7 +++-- mygpo/share/userpage.py | 18 ++++++------ mygpo/web/views/__init__.py | 20 ++++++++++--- requirements.txt | 1 - 6 files changed, 71 insertions(+), 31 deletions(-) diff --git a/mygpo/api/advanced/__init__.py b/mygpo/api/advanced/__init__.py index 48925152..33815758 100644 --- a/mygpo/api/advanced/__init__.py +++ b/mygpo/api/advanced/__init__.py @@ -21,7 +21,11 @@ from collections import defaultdict, namedtuple from datetime import datetime import dateutil.parser -import gevent + +try: + import gevent +except ImportError: + gevent = None from django.http import HttpResponse, HttpResponseBadRequest, Http404, HttpResponseNotFound from django.contrib.sites.models import RequestSite @@ -524,19 +528,31 @@ def get_episode_updates(user, subscribed_podcasts, since): episode_status = {} # get episodes - episode_jobs = [gevent.spawn(episodes_for_podcast, p, since) for p in - subscribed_podcasts] - gevent.joinall(episode_jobs) - episodes = chain.from_iterable(job.get() for job in episode_jobs) + if gevent: + episode_jobs = [gevent.spawn(episodes_for_podcast, p, since) for p in + subscribed_podcasts] + gevent.joinall(episode_jobs) + episodes = chain.from_iterable(job.get() for job in episode_jobs) + + else: + episodes = [episodes_for_podcast(p, since) for p in subscribed_podcasts] + for episode in episodes: episode_status[episode._id] = EpisodeStatus(episode, 'new', None) + # get episode states - e_action_jobs = [gevent.spawn(get_podcasts_episode_states, p, user._id) - for p in subscribed_podcasts] - gevent.joinall(e_action_jobs) - e_actions = chain.from_iterable(job.get() for job in e_action_jobs) + if gevent: + e_action_jobs = [gevent.spawn(get_podcasts_episode_states, p, user._id) + for p in subscribed_podcasts] + gevent.joinall(e_action_jobs) + e_actions = chain.from_iterable(job.get() for job in e_action_jobs) + + else: + e_actions = [get_podcasts_episode_states(p, user._id) for p + in subscribed_podcasts] + for action in e_actions: e_id = action['episode_id'] diff --git a/mygpo/core/podcasts.py b/mygpo/core/podcasts.py index 1824456c..4ca3d766 100644 --- a/mygpo/core/podcasts.py +++ b/mygpo/core/podcasts.py @@ -1,6 +1,9 @@ from itertools import chain, islice -import gevent +try: + import gevent +except ImportError: + gevent = None from mygpo.core.models import Podcast from mygpo.core.proxy import proxy_object @@ -27,13 +30,20 @@ class PodcastSet(set): podcast_dict = dict((p.get_id(), p) for p in podcasts) - jobs = [gevent.spawn(episodes_for_podcast, podcast, since=1, - until=max_date, descending=True, - limit=max_per_podcast) for podcast in podcasts] + if gevent: + jobs = [gevent.spawn(episodes_for_podcast, podcast, since=1, + until=max_date, descending=True, + limit=max_per_podcast) for podcast in podcasts] - gevent.joinall(jobs) + gevent.joinall(jobs) + + episodes = chain.from_iterable(job.get() for job in jobs) + + else: + episodes = [episodes_for_podcast(podcast, since=1, + until=max_date, descending=True, + limit=max_per_podcast) for podcast in podcasts] - episodes = chain.from_iterable(job.get() for job in jobs) episodes = sorted(episodes, key=lambda e: e.released, reverse=True) diff --git a/mygpo/data/management/commands/feed-downloader.py b/mygpo/data/management/commands/feed-downloader.py index ba4b3bfd..8ecf5d77 100644 --- a/mygpo/data/management/commands/feed-downloader.py +++ b/mygpo/data/management/commands/feed-downloader.py @@ -7,8 +7,11 @@ from restkit.errors import RequestFailed from mygpo.maintenance.management.podcastcmd import PodcastCommand from mygpo.data.feeddownloader import PodcastUpdater -from gevent import monkey -monkey.patch_all() +try: + from gevent import monkey + monkey.patch_all() +except ImportError: + pass class Command(PodcastCommand): diff --git a/mygpo/share/userpage.py b/mygpo/share/userpage.py index f2c46f93..5f0b1779 100644 --- a/mygpo/share/userpage.py +++ b/mygpo/share/userpage.py @@ -1,6 +1,6 @@ from datetime import datetime, timedelta -import gevent +from functools import partial from django.shortcuts import render from django.views.generic.base import View @@ -32,14 +32,14 @@ class UserpageView(GeventView): site = RequestSite(request) context_funs = { - 'lists': gevent.spawn(self.get_podcast_lists, user), - 'subscriptions': gevent.spawn(self.get_subscriptions, user), - 'recent_episodes': gevent.spawn(self.get_recent_episodes, user), - 'seconds_played_total': gevent.spawn(self.get_seconds_played_total, user), - 'seconds_played_month': gevent.spawn(self.get_seconds_played_since, user, month_ago), - 'favorite_episodes': gevent.spawn(self.get_favorite_episodes, user), - 'num_played_episodes_total': gevent.spawn(self.get_played_episodes_total, user), - 'num_played_episodes_month': gevent.spawn(self.get_played_episodes_since, user, month_ago), + 'lists': partial(self.get_podcast_lists, user), + 'subscriptions': partial(self.get_subscriptions, user), + 'recent_episodes': partial(self.get_recent_episodes, user), + 'seconds_played_total': partial(self.get_seconds_played_total, user), + 'seconds_played_month': partial(self.get_seconds_played_since, user, month_ago), + 'favorite_episodes': partial(self.get_favorite_episodes, user), + 'num_played_episodes_total': partial(self.get_played_episodes_total, user), + 'num_played_episodes_month': partial(self.get_played_episodes_since, user, month_ago), } context = { diff --git a/mygpo/web/views/__init__.py b/mygpo/web/views/__init__.py index 32a20a4a..7176b34a 100644 --- a/mygpo/web/views/__init__.py +++ b/mygpo/web/views/__init__.py @@ -19,7 +19,10 @@ import sys from collections import defaultdict from datetime import datetime, timedelta -import gevent +try: + import gevent +except ImportError: + gevent = None from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect @@ -245,9 +248,18 @@ class GeventView(View): context_funs is a context-key => Greenlet object mapping """ - gevent.joinall(context_funs.values()) + if gevent: + jobs = {} + for key, fun in context_funs.items(): + jobs[key] = gevent.spawn(fun) - for key, gev in context_funs.items(): - context_funs[key] = gev.get() + gevent.joinall(jobs.values()) + + for key, gev in jobs.items(): + context_funs[key] = gev.get() + + else: + for key, fun in context_funs.items(): + context_funs[key] = fun() return context_funs diff --git a/requirements.txt b/requirements.txt index 82336cc0..7c9b53c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,6 @@ python-dateutil flup PIL Babel -gevent Django markdown2 simplejson -- 2.11.4.GIT