|
- #!/usr/bin/env python
- # encoding: utf-8
- # Thomas Nagy, 2021 (ita)
-
- from waflib import Utils, Runner
-
- """
- Re-enable the classic threading system from waf 1.x
-
- def configure(conf):
- conf.load('classic_runner')
- """
-
- class TaskConsumer(Utils.threading.Thread):
- """
- Task consumers belong to a pool of workers
-
- They wait for tasks in the queue and then use ``task.process(...)``
- """
- def __init__(self, spawner):
- Utils.threading.Thread.__init__(self)
- """
- Obtain :py:class:`waflib.Task.TaskBase` instances from this queue.
- """
- self.spawner = spawner
- self.daemon = True
- self.start()
-
- def run(self):
- """
- Loop over the tasks to execute
- """
- try:
- self.loop()
- except Exception:
- pass
-
- def loop(self):
- """
- Obtain tasks from :py:attr:`waflib.Runner.TaskConsumer.ready` and call
- :py:meth:`waflib.Task.TaskBase.process`. If the object is a function, execute it.
- """
- master = self.spawner.master
- while 1:
- if not master.stop:
- try:
- tsk = master.ready.get()
- if tsk:
- tsk.log_display(tsk.generator.bld)
- master.process_task(tsk)
- else:
- break
- finally:
- master.out.put(tsk)
-
- class Spawner(object):
- """
- Daemon thread that consumes tasks from :py:class:`waflib.Runner.Parallel` producer and
- spawns a consuming thread :py:class:`waflib.Runner.Consumer` for each
- :py:class:`waflib.Task.Task` instance.
- """
- def __init__(self, master):
- self.master = master
- """:py:class:`waflib.Runner.Parallel` producer instance"""
-
- self.pool = [TaskConsumer(self) for i in range(master.numjobs)]
-
- Runner.Spawner = Spawner
|