diff --git a/packages/flamenco-worker-python/flamenco_worker/cli.py b/packages/flamenco-worker-python/flamenco_worker/cli.py index 90e499c7aad439176186d255c54ada8098e3ad5d..9c2177a9d8f2444df666b3d912e8712f01ac7c81 100644 --- a/packages/flamenco-worker-python/flamenco_worker/cli.py +++ b/packages/flamenco-worker-python/flamenco_worker/cli.py @@ -54,7 +54,7 @@ def main(): confparser = config.load_config(args.config, args.verbose) # Construct the AsyncIO loop - loop = asyncio.get_event_loop() + loop = construct_asyncio_loop() if args.verbose: log.debug('Enabling AsyncIO debugging') loop.set_debug(True) @@ -111,5 +111,20 @@ def main(): log.warning('Shutting down') +def construct_asyncio_loop() -> asyncio.AbstractEventLoop: + # On Windows, the default event loop is SelectorEventLoop which does + # not support subprocesses. ProactorEventLoop should be used instead. + # Source: https://docs.python.org/3.5/library/asyncio-subprocess.html + import sys + + if sys.platform == 'win32': + loop = asyncio.ProactorEventLoop() + asyncio.set_event_loop(loop) + else: + loop = asyncio.get_event_loop() + + return loop + + if __name__ == '__main__': main() diff --git a/packages/flamenco-worker-python/tests/test_upstream_update_queue.py b/packages/flamenco-worker-python/tests/test_upstream_update_queue.py index 6f7536c271b805feb0b1b692e9e98b9dfbd4e754..9d5527f64ceba45fb74dbf86c75c610042f1a1bd 100644 --- a/packages/flamenco-worker-python/tests/test_upstream_update_queue.py +++ b/packages/flamenco-worker-python/tests/test_upstream_update_queue.py @@ -13,9 +13,10 @@ class TaskUpdateQueueTest(AbstractWorkerTest): def setUp(self): from flamenco_worker.upstream import FlamencoManager from flamenco_worker.upstream_update_queue import TaskUpdateQueue + from flamenco_worker.cli import construct_asyncio_loop from mock_responses import CoroMock - self.asyncio_loop = asyncio.get_event_loop() + self.asyncio_loop = construct_asyncio_loop() self.shutdown_future = self.asyncio_loop.create_future() self.manager = Mock(spec=FlamencoManager) diff --git a/packages/flamenco-worker-python/tests/test_worker.py b/packages/flamenco-worker-python/tests/test_worker.py index 228bef28e69ad9aa146d4f9f6a212b6bb5a3e548..89ef0209648a469e4b00e4b11ce1f73e14acf407 100644 --- a/packages/flamenco-worker-python/tests/test_worker.py +++ b/packages/flamenco-worker-python/tests/test_worker.py @@ -8,12 +8,13 @@ import requests class AbstractWorkerTest(unittest.TestCase): def setUp(self): + from flamenco_worker.cli import construct_asyncio_loop from flamenco_worker.upstream import FlamencoManager from flamenco_worker.worker import FlamencoWorker from flamenco_worker.runner import TaskRunner from flamenco_worker.upstream_update_queue import TaskUpdateQueue - self.asyncio_loop = asyncio.get_event_loop() + self.asyncio_loop = construct_asyncio_loop() self.shutdown_future = self.asyncio_loop.create_future() self.manager = Mock(spec=FlamencoManager) @@ -116,7 +117,9 @@ class WorkerStartupTest(AbstractWorkerTest): class TestWorkerTaskFetch(AbstractWorkerTest): def setUp(self): super().setUp() - self.loop = asyncio.get_event_loop() + from flamenco_worker.cli import construct_asyncio_loop + + self.loop = construct_asyncio_loop() self.worker.loop = self.loop def run_loop_for(self, seconds: float):