On 07/20/2017 12:44 PM, Andrew McLean wrote:
I have a program where I am currently using a concurrent.futures.ThreadPoolExecutor to run multiple tasks concurrently. These tasks are typically I/O bound, involving access to local databases and remote REST APIs. However, these tasks could themselves be split into subtasks, which would also benefit from concurrency.

What I am hoping is that it is safe to use a concurrent.futures.ThreadPoolExecutor within the tasks. I have coded up a toy example, which seems to work. However, I'd like some confidence that this is intentional. Concurrency is notoriously tricky.

I very much hope this is safe, because otherwise it would not be safe to use a ThreadPoolExecutor to execute arbitrary code, in case it also used concurrent.futures to exploit concurrency.


Well that last statement is clearly false. It's not safe to use any multiple access mechanism (threading, processes, async stuff) to execute arbitrary code; so it's by definition not safe to use a ThreadPoolExecutor.

I'm not being cute and using "safe" in some Turing sense, I'm talking specifically about multiple accesses. Whenever you have multiple access you have interlock issues, which you resolve with mutexes or message queues or however you decide to do so. Those issues don't go away when you use the ThreadPoolExecutor. There is every possibility, especially if you start recursively spawning threads, that A spawns B, A blocks on something that B is supposed to do (such as completing a Future), but due to the thread limit of the pool, the mere existence of A is preventing B from being executed, and you have a deadlock.

--
Rob Gaddi, Highland Technology -- www.highlandtechnology.com
Email address domain is currently out of order.  See above to fix.
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to