-
Notifications
You must be signed in to change notification settings - Fork 0
/
worker.py
82 lines (67 loc) · 2.01 KB
/
worker.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# -*- coding: utf-8 -*-
import os
import sys
import time
import errno
import random
import socket
import select
import signal
from datetime import datetime, timedelta
from core import Buffer, HandlerMap
class Worker(object):
def __init__(self, parent, store):
self.parent = parent
self.store = store
self.buffer = Buffer()
self.handlers = HandlerMap()
self.stoped = False
def start(self):
self.register_handlers()
self.register_signals()
while not self.stoped:
self.interact()
def register_handlers(self):
self.handlers.add_handler('bye', self.bye)
self.handlers.add_handler('task', self.task)
def command(self, cmd):
self.buffer.append(self.parent, cmd)
while True:
fd, cmd_type, cmd_param = self.buffer.next_cmd()
if not cmd_type:
break
self.handlers.process_cmd(fd, cmd_type, cmd_param)
def bye(self,fd,param):
self.prepare_exit()
def task(self, fd, param):
task_id = int(param)
task_info = self.store.get_task(task_id)
if task_info:
task_info.run()
self.send_parent('task_finish:%s' % task_id)
def send_parent(self, cmd):
self.parent.send(cmd + ';')
def interact(self):
r,w,e=[],[],[]
try:
r,w,e=select.select([self.parent], [self.parent], [], 2)
except select.error, ex:
if ex[0] == errno.EINTR:
self.prepare_exit()
return
if ex[0] == errno.EAGAIN:
pass
else:
raise
if not r:
return
father = r[0]
cmd = father.recv(1024)
self.command(cmd)
def prepare_exit(self):
self.stoped = True
def register_signals(self):
signal.signal(signal.SIGINT, self.int_handler)
def int_handler(self, signum, frame):
print 'signal catched %s %s' % (signum, frame)
self.prepare_exit()