)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ee34caf97f32cbd0cfe931906f41e29cf1385641","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Joshua Harlow \u003charlowja@yahoo-inc.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-04-22 19:17:29 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add the start of a futures model for async work/additions"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"https://docs.python.org/dev/library/concurrent.futures.html"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"bab921fb_d13c9131","line":7,"updated":"2015-04-23 07:22:51.000000000","message":"Is this change part of the larger project to replace eventlet with something else?\n\nIf yes, maybe it should be done in a separated library until the whole project is reviewed and accepted. At this point, it\u0027s unclear which option is better (taskflow, threads, asyncio, goroutines, etc.). If we add new code into a library, we must maintain it forever.\n\nSynchronousExecutor is quite simple and it can be useful in many cases, so I\u0027m ok to add item. My reserve is more general than this specific change.","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c9a77476bc64a6da790dfbd801e6ee305779ec41","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Joshua Harlow \u003charlowja@yahoo-inc.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-04-22 19:17:29 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add the start of a futures model for async work/additions"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"https://docs.python.org/dev/library/concurrent.futures.html"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"bab921fb_8de700e4","line":7,"in_reply_to":"bab921fb_d13c9131","updated":"2015-04-23 18:46:46.000000000","message":"Maybe part of that change, but sometimes we just need to *bust* through the inability to agree on anything and start to make things happen, maybe this can help make that happen... Sometimes tools just need to be made available and get them to be used ... Whether this can or can\u0027t, idk. ha.","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"}],"oslo_utils/futures.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ee34caf97f32cbd0cfe931906f41e29cf1385641","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from concurrent import futures as _futures"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class _WorkItem(object):"},{"line_number":21,"context_line":"    \"\"\"A unit of work to run somewhere.\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, future, fn, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab921fb_31abcd8b","line":20,"updated":"2015-04-23 07:22:51.000000000","message":"This class looks useless. Why not inlining code in submit()?\n\nIn the trollius project, I wrote a SynchronousExecutor class when the concurrent.futures module is missing:\n\nhttps://bitbucket.org/enovance/trollius/src/1f99b6967b418c0d4575f2c47c90b7b0c71f25d7/trollius/executor.py?at\u003dtrollius#cl-59\n\nTrollius uses futures backport on Python 2, but sometimes it\u0027s convenient to have this blocking executor.","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c9a77476bc64a6da790dfbd801e6ee305779ec41","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from concurrent import futures as _futures"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class _WorkItem(object):"},{"line_number":21,"context_line":"    \"\"\"A unit of work to run somewhere.\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def __init__(self, future, fn, args, kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab921fb_cd4a9883","line":20,"in_reply_to":"bab921fb_31abcd8b","updated":"2015-04-23 18:46:46.000000000","message":"Cool, looks like we both made something similar :-P","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ee34caf97f32cbd0cfe931906f41e29cf1385641","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.kwargs \u003d kwargs"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def run(self):"},{"line_number":30,"context_line":"        if not self.future.set_running_or_notify_cancel():"},{"line_number":31,"context_line":"            return"},{"line_number":32,"context_line":"        try:"},{"line_number":33,"context_line":"            result \u003d self.fn(*self.args, **self.kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab921fb_d1793131","line":30,"updated":"2015-04-23 07:22:51.000000000","message":"_WorkItem is private, so it\u0027s only used here.\n\n_WorkItem is only called from submit() which creates a future and immediatly call run(). Why checking if the future was cancelled?\nhttps://docs.python.org/dev/library/concurrent.futures.html#concurrent.futures.Future.set_running_or_notify_cancel","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c9a77476bc64a6da790dfbd801e6ee305779ec41","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.kwargs \u003d kwargs"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def run(self):"},{"line_number":30,"context_line":"        if not self.future.set_running_or_notify_cancel():"},{"line_number":31,"context_line":"            return"},{"line_number":32,"context_line":"        try:"},{"line_number":33,"context_line":"            result \u003d self.fn(*self.args, **self.kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab921fb_4d78c8c4","line":30,"in_reply_to":"bab921fb_d1793131","updated":"2015-04-23 18:46:46.000000000","message":"Ya, so this can also be shared with: https://github.com/openstack/taskflow/blob/master/taskflow/types/futures.py#L276 if we ever move that over... I\u0027m fine doing that here also, but sharing this could make it easier to move such a thing over in the future...","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ee34caf97f32cbd0cfe931906f41e29cf1385641","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class SynchronousExecutor(_futures.Executor):"},{"line_number":41,"context_line":"    \"\"\"Executor that uses the caller to execute calls synchronously."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    This provides an interface to a caller that looks like an executor but"},{"line_number":44,"context_line":"    will execute the calls inside the caller thread instead of executing it"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab921fb_71b6e5dd","line":41,"updated":"2015-04-23 07:22:51.000000000","message":"This class looks to be related to concurrency, ex: it uses the \"concurrent.futures\" (concurrent!) module. Why not putting it in oslo.concurrency?","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"c9a77476bc64a6da790dfbd801e6ee305779ec41","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class SynchronousExecutor(_futures.Executor):"},{"line_number":41,"context_line":"    \"\"\"Executor that uses the caller to execute calls synchronously."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    This provides an interface to a caller that looks like an executor but"},{"line_number":44,"context_line":"    will execute the calls inside the caller thread instead of executing it"}],"source_content_type":"text/x-python","patch_set":4,"id":"bab921fb_8db6e088","line":41,"in_reply_to":"bab921fb_71b6e5dd","updated":"2015-04-23 18:46:46.000000000","message":"Could, but then once again, we start dragging in more and more dependencies (oslo.concurrency brings in oslo.config which brings in ....); I\u0027d like for dependency chains to be small, and having this there doesn\u0027t make it that small, but could be done...\n\nBut maybe this code shouldn\u0027t even go into oslo.utils in the first place, maybe a new library? Not sure...","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"6a81be52c2c2010987afa1b722eb9e00f2ebc666","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class SynchronousExecutor(_futures.Executor):"},{"line_number":41,"context_line":"    \"\"\"Executor that uses the caller to execute calls synchronously."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    This provides an interface to a caller that looks like an executor but"},{"line_number":44,"context_line":"    will execute the calls inside the caller thread instead of executing it"}],"source_content_type":"text/x-python","patch_set":4,"id":"3acd31a7_745a1652","line":41,"in_reply_to":"bab921fb_8db6e088","updated":"2015-05-01 18:00:20.000000000","message":"I would like to use that in oslo.messaging too, I prefer avoid oslo.concurrency too.\n\noslo.utils looks good for me.","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"}],"requirements.txt":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ee34caf97f32cbd0cfe931906f41e29cf1385641","unresolved":false,"context_lines":[{"line_number":14,"context_line":"oslo.i18n\u003e\u003d1.5.0  # Apache-2.0"},{"line_number":15,"context_line":"netaddr\u003e\u003d0.7.12"},{"line_number":16,"context_line":"netifaces\u003e\u003d0.10.4"},{"line_number":17,"context_line":"futures\u003e\u003d2.1.6"}],"source_content_type":"text/plain","patch_set":4,"id":"bab921fb_d1c7f143","line":17,"updated":"2015-04-23 07:22:51.000000000","message":"oslo.concurrency already depends on futures in test-requirements.txt.\n\nI\u0027m not sure that it\u0027s ok to add this new dependency for oslo.utils (see the comment above).","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"5768e2eeec703200801c024ebadfc19581038edc","unresolved":false,"context_lines":[{"line_number":14,"context_line":"oslo.i18n\u003e\u003d1.5.0  # Apache-2.0"},{"line_number":15,"context_line":"netaddr\u003e\u003d0.7.12"},{"line_number":16,"context_line":"netifaces\u003e\u003d0.10.4"},{"line_number":17,"context_line":"futures\u003e\u003d2.1.6"}],"source_content_type":"text/plain","patch_set":4,"id":"bab921fb_6d170c52","line":17,"in_reply_to":"bab921fb_d1c7f143","updated":"2015-04-23 18:46:59.000000000","message":"Ya, idk either, ha.","commit_id":"7975a843bdd7d9c1e1bcdb47a53602e1743d5c5f"}]}
