Skip to content

Commit 69015e4

Browse files
author
Matt George
committed
added some updates for the web interface
1 parent a6337ef commit 69015e4

File tree

4 files changed

+67
-22
lines changed

4 files changed

+67
-22
lines changed

src/pyres/__init__.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def str_to_class(s):
1919
class ResQ(object):
2020
_res = None
2121
def __init__(self, server="localhost:6379"):
22+
self._server = server
2223
host, port = server.split(':')
2324
self._redis = Redis(host=host, port=int(port))
2425
self._watched_queues = {}
@@ -57,8 +58,10 @@ def encode(cls, item):
5758

5859
@classmethod
5960
def decode(cls, item):
60-
ret = simplejson.loads(item)
61-
return ret
61+
if item:
62+
ret = simplejson.loads(item)
63+
return ret
64+
return None
6265

6366
@classmethod
6467
def enqueue(cls, klass, *args):
@@ -76,6 +79,10 @@ def queues(cls, server="localhost:6379"):
7679
resq = cls(server)
7780
return resq._redis.smembers("queues")
7881

82+
#@classmethod
83+
#def working(cls, server="localhost:6379"):
84+
# resq = cls(server)
85+
# return Worker.working(resq)
7986
class Stat(object):
8087
def __init__(self, name, resq):
8188
self.name = name

src/pyres/worker.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ def working_on(self, job):
105105
data = simplejson.dumps(data)
106106
self.resq._redis.set("worker:%s" % str(self), data)
107107

108+
def job(self):
109+
return ResQ.decode(self.resq._redis.get("worker:%s" % self)) or {}
110+
108111
def done_working(self):
109112
self.processed()
110113
self.resq._redis.delete("worker:%s" % str(self))
@@ -128,6 +131,8 @@ def job(self):
128131
return {}
129132

130133
def __str__(self):
134+
if getattr(self,'id', None):
135+
return self.id
131136
import os;
132137
hostname = os.uname()[1]
133138
pid = os.getpid()
@@ -137,7 +142,35 @@ def __str__(self):
137142
def run(cls, queues, host):
138143
worker = cls(queues=queues, host=host)
139144
worker.work()
140-
145+
@classmethod
146+
def all(cls, host):
147+
resq = ResQ(host)
148+
return resq._redis.smembers('workers')
149+
@classmethod
150+
def working(cls, host):
151+
resq = ResQ(host)
152+
total = []
153+
for key in Worker.all(host):
154+
if Worker.exists(key,resq):
155+
total.append(key)
156+
#total = [id if Worker.exists(id,resq) for id in resq.redis.smembers('workers')]
157+
names = [Worker.find(key[7:],resq) for key in resq._redis.mget(*total)] if total else []
158+
return names
159+
160+
@classmethod
161+
def find(cls, worker_id, resq):
162+
if Worker.exists(worker_id, resq):
163+
queues = worker_id.split(':')[-1].split(',')
164+
worker = cls(queues,resq._server)
165+
worker.id = worker_id
166+
return worker
167+
else:
168+
return None
169+
170+
@classmethod
171+
def exists(cls, worker_id, resq):
172+
return resq._redis.sismember('workers', worker_id)
173+
141174
class JuniorWorker(Worker):
142175
def work(self, interval=5):
143176
self.startup()
Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,36 @@
11
{% extends "base.html" %}
22
{%block main%}
3-
<% workers = resque.working %>
4-
<h1><%= workers.size %> of <%= resque.workers.size %> Workers Working</h1>
3+
<h1>{{current_count}} of {{total_workers}} Workers Working</h1>
54
<table>
65
<tr>
76
<th>&nbsp;</th>
87
<th>Where</th>
98
<th>Queue</th>
109
<th>Processing</th>
1110
</tr>
12-
<% if workers.empty? %>
11+
{% if not workers %}
1312
<tr>
1413
<td colspan="4">Not a one.</td>
1514
</tr>
16-
<% end %>
15+
{% endif %}
1716

18-
<% for worker in workers.sort_by { |w| w.job['run_at'] ? w.job['run_at'] : '' } %>
19-
<% job = worker.job %>
17+
{% for worker in workers %}
18+
2019
<tr>
21-
<td><img src="<%=u state = worker.state %>.png" alt="<%= state %>" title="<%= state %>"></td>
22-
<% host, pid, queues = worker.to_s.split(':') %>
23-
<td><a href="<%=u "/workers/#{worker}" %>"><%= host %>:<%= pid %></a></td>
20+
<td><img src="" alt="" title=""></td>
21+
<td><a href="#">{{worker._host}}:{{worker._pid}}</a></td>
2422
<td>
25-
<a class="queue" href="<%=u "/queues/#{job['queue']}" %>"><%= job['queue'] %></a>
23+
<a class="queue" href="#">{{worker.job.queue}}</a>
2624
</td>
2725
<td>
28-
<% if job['queue'] %>
29-
<code><%= job['payload']['class'] %></code>
30-
<small><a class="queue time" href="<%=u "/working/#{worker}" %>"><%= job['run_at'] %></a></small>
31-
<% else %>
26+
{% if worker.job.queue %}
27+
<code>{{ worker.job.payload.klass }}</code>
28+
<small><a class="queue time" href="#">{{worker.job.run_at}}</a></small>
29+
{% else %}
3230
Waiting for more
33-
<% end %>
31+
{% endif %}
3432
</td>
3533
</tr>
36-
<% end %>
34+
{% endfor %}
3735
</table>
3836
{%endblock%}

src/resweb/core/views.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from resweb.decorators import render_to
55
from pyres import ResQ
66
from pyres.failure import Failure
7+
from pyres.worker import Worker
78
class Queue(object):
89
def __init__(self, name, count):
910
self.name = name
@@ -21,9 +22,15 @@ def index(request):
2122

2223
@render_to('working.html')
2324
def working(request):
24-
current = request.resq.working()
25-
total_workers = len(request.resq.workers())
26-
return {}
25+
workers = []
26+
for worker in Worker.working(request.resq._server):
27+
host, pid, queues = str(worker).split(':')
28+
worker._host
29+
worker._pid
30+
workers.append(worker)
31+
current_count = len(workers)
32+
total_workers = len(Worker.all(settings.RESQ_HOST))
33+
return locals()
2734

2835
def failed(request):
2936
return {}

0 commit comments

Comments
 (0)