ben-denham / labtech

Easily run experiment permutations with multi-processing and caching
https://ben-denham.github.io/labtech/
GNU General Public License v3.0
7 stars 1 forks source link

Subprocess error when running from Python terminal: AttributeError: Can't get attribute 'DependentTask' on <module '__main__' (built-in)> #25

Closed nathanjmcdougall closed 4 months ago

nathanjmcdougall commented 4 months ago

When running the code at tests\integration\readme\dependents_and_mermaid.py by pasting lines into Powershell on Windows, I get this lengthly stack trace. As far as I can tell, it seems to be some issue with Pickling going wrong, but I haven't looked into the details at all. See output below.

Note that this issue does not reproduce when running the .py file directly via poetry run python tests\integration\readme\dependents_and_mermaid.py, see https://github.com/ben-denham/labtech/issues/16#issuecomment-2119980702

Maybe this is something to do with the way that __name__ works, which is not something I have ever fully understood.

``` >>> from time import sleep >>> >>> import labtech >>> >>> >>> @labtech.task ... class SlowTask: ... base: int ... def run(self) -> int: ... # sleep(5) ... return self.base ** 2 ... >>> @labtech.task ... class DependentTask: ... slow_task: SlowTask ... multiplier: int ... def run(self) -> int: ... return self.multiplier * self.slow_task.result ... >>> def main(): ... some_slow_task = SlowTask(base=42) ... dependent_tasks = [ ... DependentTask( ... slow_task=some_slow_task, ... multiplier=multiplier, ... ) ... for multiplier in range(10) ... ] ... lab = labtech.Lab(storage='demo_lab') ... results = lab.run_tasks(dependent_tasks) ... print([results[task] for task in dependent_tasks]) ... >>> if __name__ == '__main__': ... main() ... 2024-05-20 20:53:12/SpawnProcess-3/ERROR: Captured STDERR: Process SpawnProcess-3: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-3/ERROR: Captured STDERR: Process SpawnProcess-3: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-3/ERROR: Captured STDERR: Process SpawnProcess-3: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-8/ERROR: Captured STDERR: Process SpawnProcess-8: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-4/ERROR: Captured STDERR: Process SpawnProcess-4: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-8/ERROR: Captured STDERR: Process SpawnProcess-8: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-4/ERROR: Captured STDERR: Process SpawnProcess-4: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-8/ERROR: Captured STDERR: Process SpawnProcess-8: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-4/ERROR: Captured STDERR: Process SpawnProcess-4: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-7/ERROR: Captured STDERR: Process SpawnProcess-7: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-7/ERROR: Captured STDERR: Process SpawnProcess-7: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/MainProcess/ERROR: Task 'DependentTask(slow_task=SlowTask(base=42), multiplier=1)' failed. Skipping: A process in the process pool was terminated abruptly while the future was running or pending. 2024-05-20 20:53:12/SpawnProcess-7/ERROR: Captured STDERR: Process SpawnProcess-7: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-11/ERROR: Captured STDERR: Process SpawnProcess-11: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on DependentTask: 0/10 [00:01, ?tasks/s] | | 0% [? remaining] 2024-05-20 20:53:12/SpawnProcess-11/ERROR: Captured STDERR: Process SpawnProcess-11: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-11/ERROR: Captured STDERR: Process SpawnProcess-11:53:12. Up to top 10 by start_time: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 0 active tasks as at 20:53:12. Up to top 10 by start_time: 2024-05-20 20:53:12/SpawnProcess-5/ERROR: Captured STDERR: Process SpawnProcess-5: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-5/ERROR: Captured STDERR: Process SpawnProcess-5: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-5/ERROR: Captured STDERR: Process SpawnProcess-5: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-6/ERROR: Captured STDERR: Process SpawnProcess-6: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-6/ERROR: Captured STDERR: Process SpawnProcess-6: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-6/ERROR: Captured STDERR: Process SpawnProcess-6: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-9/ERROR: Captured STDERR: Process SpawnProcess-9: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-9/ERROR: Captured STDERR: Process SpawnProcess-9: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-9/ERROR: Captured STDERR: Process SpawnProcess-9: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-10/ERROR: Captured STDERR: Process SpawnProcess-10: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-10/ERROR: Captured STDERR: Process SpawnProcess-10: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on 2024-05-20 20:53:12/SpawnProcess-10/ERROR: Captured STDERR: Process SpawnProcess-10: Captured STDERR: Traceback (most recent call last): Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 314, in _bootstrap self.run() Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\process.py", line 108, in run self._target(*self._args, **self._kwargs) Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\process.py", line 249, in _process_worker call_item = call_queue.get(block=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\multiprocessing\queues.py", line 122, in get return _ForkingPickler.loads(res) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Captured STDERR: AttributeError: Can't get attribute 'DependentTask' on Traceback (most recent call last): File "C:\Users\namc\Repositories\labtech\labtech\lab.py", line 395, in run task_result = future.result() ^^^^^^^^^^^^^^^ File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\_base.py", line 449, in result return self.__get_result() ^^^^^^^^^^^^^^^^^^^ File "C:\Users\namc\.pyenv\pyenv-win\versions\3.11.6\Lib\concurrent\futures\_base.py", line 401, in __get_result raise self._exception concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending. The above exception was the direct cause of the following exception: Traceback (most recent call last): File "", line 2, in File "", line 11, in main File "C:\Users\namc\Repositories\labtech\labtech\lab.py", line 559, in run_tasks results = runner.run(tasks) ^^^^^^^^^^^^^^^^^ File "C:\Users\namc\Repositories\labtech\labtech\lab.py", line 398, in run self.handle_failure(ex=ex, message=f"Task '{task}' failed.") File "C:\Users\namc\Repositories\labtech\labtech\lab.py", line 278, in handle_failure raise lab_error from ex labtech.exceptions.LabError: A process in the process pool was terminated abruptly while the future was running or pending. >>> from labtech.diagram import display_task_diagram >>> >>> some_slow_task = SlowTask(base=42) >>> dependent_tasks = [ ... DependentTask( ... slow_task=some_slow_task, ... multiplier=multiplier, ... ) ... for multiplier in range(10) ... ] >>> >>> display_task_diagram(dependent_tasks) classDiagram direction BT class DependentTask DependentTask : SlowTask slow_task DependentTask : int multiplier DependentTask : run() int class SlowTask SlowTask : int base SlowTask : run() int DependentTask <-- SlowTask: slow_task ```
ben-denham commented 4 months ago

Ok, I was able to reproduce this error on Windows, and I was also able to reproduce on Linux after calling multiprocessing.set_start_method('spawn') or multiprocessing.set_start_method('forkserver') (Linux defaults to a start method of 'fork').

Unfortunately this is an inherent issue with those start methods so the only resolution here is to document it, which I've done here: https://github.com/ben-denham/labtech/commit/88265be51a60159fb4f64c3c7afc4921d941c7b5