[Python-Dev] futures API
Brian Quinlan
brian at sweetapp.com
Fri Dec 10 21:07:48 CET 2010
On Dec 10, 2010, at 11:39 AM, Thomas Nagy wrote:
> --- El vie, 10/12/10, Thomas Nagy escribió:
>> --- El vie, 10/12/10, Brian Quinlan
>> escribió:
>>> On Dec 10, 2010, at 5:36 AM, Thomas Nagy wrote:
>>>> I have a process running for a long time, and
>> which
>>> may use futures of different max_workers count. I
>> think it
>>> is not too far-fetched to create a new futures object
>> each
>>> time. Yet, the execution becomes slower after each
>> call, for
>>> example with http://freehackers.org/~tnagy/futures_test.py:
>>>>
>>>> """
>>>> import concurrent.futures
>>>> from queue import Queue
>>>> import datetime
>>>>
>>>> class counter(object):
>>>> def __init__(self, fut):
>>>> self.fut = fut
>>>>
>>>> def run(self):
>>>> def
>>> look_busy(num, obj):
>>>>
>>> tot = 0
>>>>
>>> for x in range(num):
>>>>
>>> tot += x
>>>>
>>> obj.out_q.put(tot)
>>>>
>>>> start =
>>> datetime.datetime.utcnow()
>>>> self.count = 0
>>>> self.out_q =
>>> Queue(0)
>>>> for x in
>>> range(1000):
>>>>
>>> self.count += 1
>>>>
>>> self.fut.submit(look_busy, self.count,
>>> self)
>>>>
>>>> while
>>> self.count:
>>>>
>>> self.count -= 1
>>>>
>>> self.out_q.get()
>>>>
>>>> delta =
>>> datetime.datetime.utcnow() - start
>>>>
>>> print(delta.total_seconds())
>>>>
>>>> fut =
>>> concurrent.futures.ThreadPoolExecutor(max_workers=20)
>>>> for x in range(100):
>>>> # comment the following line
>>>> fut =
>>> concurrent.futures.ThreadPoolExecutor(max_workers=20)
>>>> c = counter(fut)
>>>> c.run()
>>>> """
>>>>
>>>> The runtime grows after each step:
>>>> 0.216451
>>>> 0.225186
>>>> 0.223725
>>>> 0.222274
>>>> 0.230964
>>>> 0.240531
>>>> 0.24137
>>>> 0.252393
>>>> 0.249948
>>>> 0.257153
>>>> ...
>>>>
>>>> Is there a mistake in this piece of code?
>>>
>>> There is no mistake that I can see but I suspect that
>> the
>>> circular references that you are building are causing
>> the
>>> ThreadPoolExecutor to take a long time to be
>> collected. Try
>>> adding:
>>>
>>> c = counter(fut)
>>> c.run()
>>> + fut.shutdown()
>>>
>>> Even if that fixes your problem, I still don't fully
>>> understand this because I would expect the runtime to
>> fall
>>> after a while as ThreadPoolExecutors are collected.
>>
>> The shutdown call is indeed a good fix :-) Here is the time
>> response of the calls to counter() when shutdown is not
>> called:
>> http://www.freehackers.org/~tnagy/runtime_futures.png
>>
>> After trying to stop the program by using CTRL+C, the
>> following error may appear, after which the process cannot
>> be interrupted:
>>
>> """
>> 19:18:12 /tmp/build> python3.2 futures_test.py
>> 0.389657
>> 0.417173
>> 0.416513
>> 0.421424
>> 0.449666
>> 0.482273
>> ^CTraceback (most recent call last):
>> File "futures_test.py", line 36, in <module>
>> c.run()
>> File "futures_test.py", line 22, in run
>> self.fut.submit(look_busy, self.count, self)
>> File
>> "/usr/local/lib/python3.2/concurrent/futures/thread.py",
>> line 114, in submit
>> self._work_queue.put(w)
>> File "/usr/local/lib/python3.2/queue.py", line 135, in
>> put
>> self.not_full.acquire()
>> KeyboardInterrupt
>> """
>>
>> It is not expected, is it?
>
> The problem also occurs when using a callback:
> http://www.freehackers.org/~tnagy/futures_test2.py
>
> If it is necessary to catch KeyboardInterrupt exceptions to cancel
> the futures execution, then how about adding this detail to the docs?
AFAIK, catching KeyboardInterrupt exceptions is not sufficient.
Cheers,
Brian
> Thomas
>
>
>
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: http://mail.python.org/mailman/options/python-dev/brian%40sweetapp.com
More information about the Python-Dev
mailing list