Merge lp:~ken-vandine/gwibber/lp_906916 into lp:gwibber

Proposed by Ken VanDine
Status: Merged
Merged at revision: 1235
Proposed branch: lp:~ken-vandine/gwibber/lp_906916
Merge into: lp:gwibber
Diff against target: 77 lines (+12/-25)
1 file modified
gwibber/microblog/dispatcher.py (+12/-25)
To merge this branch: bzr merge lp:~ken-vandine/gwibber/lp_906916
Reviewer Review Type Date Requested Status
Michael Terry (community) Approve
Review via email: mp+88455@code.launchpad.net

Description of the change

Drop the use of threading.Thread just to create a multiprocessing pool and ensure the pool gets closed after operations are done. This prevents the constant polling between workers which caused frequent wakeups and excessive power use.

To post a comment you must log in.
Revision history for this message
Michael Terry (mterry) wrote :

Looks great!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'gwibber/microblog/dispatcher.py'
2--- gwibber/microblog/dispatcher.py 2011-11-01 13:54:37 +0000
3+++ gwibber/microblog/dispatcher.py 2012-01-13 08:25:41 +0000
4@@ -1,7 +1,7 @@
5 #!/usr/bin/env python
6 # -*- coding: utf-8 -*-
7
8-import multiprocessing, threading, traceback, json
9+import multiprocessing, traceback, json
10 import gobject, dbus, dbus.service
11 import sqlite3, mx.DateTime, re, uuid
12 import urlshorter, storage, network, util, uploader
13@@ -165,11 +165,11 @@
14 def validate_operation(self, acct, opname, enabled="receive_enabled"):
15 # if account doesn't have the required feature or is disabled, return
16 if enabled in acct:
17- if not acct[enabled]: return
18+ if not acct[enabled]: return False
19 else:
20- return
21+ return False
22 # if there is an account for a service that gwibber doesn't no about, return
23- if not acct["service"] in SERVICES: return
24+ if not acct["service"] in SERVICES: return False
25 service = SERVICES[acct["service"]]
26 return acct["service"] in PROTOCOLS and \
27 opname in service["features"] and \
28@@ -230,23 +230,6 @@
29 for o in self.search_to_operations(search):
30 yield o
31
32-class MapAsync(threading.Thread):
33- def __init__(self, func, iterable, cbsuccess, cbfailure, pool):
34- threading.Thread.__init__(self)
35- self.iterable = iterable
36- self.callback = cbsuccess
37- self.failure = cbfailure
38- self.daemon = True
39- self.func = func
40- self.pool = pool
41- self.start()
42-
43- def run(self):
44- try:
45- self.pool.map_async(self.func, self.iterable, callback = self.callback)
46- except Exception as e:
47- self.failure(e, traceback.format_exc())
48-
49 class Dispatcher(dbus.service.Object):
50 """
51 The Gwibber Dispatcher handles all the backend operations.
52@@ -340,7 +323,6 @@
53 self.launcher.set_property("count_visible", False)
54
55 self.refresh_count = 0
56- self.workerpool = multiprocessing.Pool()
57
58 self.refresh_timer_id = None
59
60@@ -664,9 +646,14 @@
61 util.notify(error["account"]["service"], error["message"], icon, 2000)
62 self.notified_errors[error["account"]["service"]] = error["message"]
63
64- def perform_async_operation(self, iterable):
65- t = MapAsync(perform_operation, iterable, self.loading_complete, self.loading_failed, self.workerpool)
66- t.join()
67+ def perform_async_operation (self, iterable):
68+ pool = multiprocessing.Pool ()
69+ try:
70+ pool.map_async (perform_operation, iterable, callback = self.loading_complete)
71+ except Exception as e:
72+ self.loading_failed (e, traceback.format_exc())
73+ pool.close ()
74+ pool.join ()
75
76 def loading_complete(self, output):
77 self.refresh_count += 1