|
1 | 1 | import threading |
| 2 | +from Queue import Queue, Empty |
| 3 | + |
2 | 4 | from .interface import show_message |
3 | | -import time |
| 5 | + |
| 6 | + |
| 7 | +MAX_LIFE = 60 |
| 8 | +CHECK_INTERVAL = .2 |
| 9 | +RESULTS = Queue() |
4 | 10 |
|
5 | 11 |
|
6 | 12 | class Task(threading.Thread): |
7 | 13 |
|
8 | | - def __init__(self, buffer, callback=None, title=None, *args, **kwargs): |
9 | | - self.buffer = buffer |
10 | | - self._stop = threading.Event() |
11 | | - self.result = None |
12 | | - self.callback = callback |
13 | | - self.done = 0 |
14 | | - self.finished = False |
15 | | - self.title = title |
| 14 | + def __init__(self, *args, **kwargs): |
| 15 | + self.stop = threading.Event() |
16 | 16 | threading.Thread.__init__(self, *args, **kwargs) |
17 | 17 |
|
18 | 18 | def run(self): |
19 | | - " Run tasks. " |
20 | | - self._Thread__target(task=self, *self._Thread__args, **self._Thread__kwargs) |
21 | | - |
22 | | - # Wait for result parsing |
23 | | - while not self.stopped(): |
24 | | - time.sleep(.2) |
| 19 | + """ Run the task. |
| 20 | + """ |
| 21 | + try: |
| 22 | + args, kwargs = self._Thread__args, self._Thread__kwargs |
| 23 | + checking = self._Thread__target(*args, **kwargs) |
| 24 | + if not self.stop.isSet(): |
| 25 | + RESULTS.put((checking, args, kwargs)) |
25 | 26 |
|
26 | | - def stop(self): |
27 | | - " Stop task. " |
28 | | - self._stop.set() |
29 | | - |
30 | | - def stopped(self): |
31 | | - return self._stop.isSet() |
32 | | - |
33 | | - |
34 | | -def stop_queue(): |
35 | | - " Stop all tasks. " |
36 | | - for thread in threading.enumerate(): |
37 | | - if isinstance(thread, Task): |
38 | | - thread.stop() |
39 | | - show_message('%s stopped.' % thread.title) |
| 27 | + except Exception as e: |
| 28 | + if not self.stop.isSet(): |
| 29 | + RESULTS.put(e) |
40 | 30 |
|
41 | 31 |
|
42 | | -def add_task(target, callback=None, buffer=None, title=None, *args, **kwargs): |
| 32 | +def add_task(target, title=None, *args, **kwargs): |
43 | 33 | " Add all tasks. " |
44 | 34 |
|
45 | | - task = Task(buffer, title=title, target=target, callback=callback, args=args, kwargs=kwargs) |
| 35 | + task = Task(target=target, args=args, kwargs=kwargs) |
46 | 36 | task.daemon = True |
47 | 37 | task.start() |
48 | 38 |
|
49 | | - show_message('%s started.' % task.title) |
| 39 | + show_message('{0} started.'.format(title)) |
50 | 40 |
|
51 | 41 |
|
52 | | -def check_task(): |
53 | | - " Check tasks for result. " |
| 42 | +def stop_queue(message=True): |
| 43 | + """ Stop all tasks. |
| 44 | + """ |
| 45 | + with RESULTS.mutex: |
| 46 | + RESULTS.queue.clear() |
| 47 | + |
54 | 48 | for thread in threading.enumerate(): |
55 | 49 | if isinstance(thread, Task): |
56 | | - if thread.finished: |
57 | | - thread.stop() |
58 | | - thread.callback(thread.result, thread.buffer.number) |
59 | | - else: |
60 | | - show_message('%s %s%%' % (thread.title, thread.done)) |
| 50 | + thread.stop.set() |
| 51 | + if message: |
| 52 | + show_message("Task stopped.") |
| 53 | + |
| 54 | + |
| 55 | +def check_task(): |
| 56 | + """ Checking running tasks. |
| 57 | + """ |
| 58 | + try: |
| 59 | + result = RESULTS.get(False) |
| 60 | + assert isinstance(result, tuple) |
| 61 | + except Empty: |
| 62 | + return False |
| 63 | + except AssertionError: |
| 64 | + return False |
| 65 | + result, _, kwargs = result |
| 66 | + callback = kwargs.pop('callback') |
| 67 | + callback(result, **kwargs) |
| 68 | + |
| 69 | + |
| 70 | +# lint_ignore=W0703 |
0 commit comments