mirror of https://github.com/python/cpython
merge heads
This commit is contained in:
commit
9a1b956dea
|
@ -321,7 +321,11 @@ class Pool(object):
|
|||
|
||||
@staticmethod
|
||||
def _handle_workers(pool):
|
||||
while pool._worker_handler._state == RUN and pool._state == RUN:
|
||||
thread = threading.current_thread()
|
||||
|
||||
# Keep maintaining workers until the cache gets drained, unless the pool
|
||||
# is terminated.
|
||||
while thread._state == RUN or (pool._cache and thread._state != TERMINATE):
|
||||
pool._maintain_pool()
|
||||
time.sleep(0.1)
|
||||
# send sentinel to stop workers
|
||||
|
|
|
@ -1217,6 +1217,20 @@ class _TestPoolWorkerLifetime(BaseTestCase):
|
|||
p.close()
|
||||
p.join()
|
||||
|
||||
def test_pool_worker_lifetime_early_close(self):
|
||||
# Issue #10332: closing a pool whose workers have limited lifetimes
|
||||
# before all the tasks completed would make join() hang.
|
||||
p = multiprocessing.Pool(3, maxtasksperchild=1)
|
||||
results = []
|
||||
for i in range(6):
|
||||
results.append(p.apply_async(sqr, (i, 0.3)))
|
||||
p.close()
|
||||
p.join()
|
||||
# check the results
|
||||
for (j, res) in enumerate(results):
|
||||
self.assertEqual(res.get(), sqr(j))
|
||||
|
||||
|
||||
#
|
||||
# Test that manager has expected number of shared objects left
|
||||
#
|
||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.2.3?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #13018: Fix reference leaks in error paths in dictobject.c.
|
||||
Patch by Suman Saha.
|
||||
|
||||
- Issue #1294232: In a few cases involving metaclass inheritance, the
|
||||
interpreter would sometimes invoke the wrong metaclass when building a new
|
||||
class object. These cases now behave correctly. Patch by Daniel Urban.
|
||||
|
@ -58,6 +61,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #10332: multiprocessing: fix a race condition when a Pool is closed
|
||||
before all tasks have completed.
|
||||
|
||||
- Issue #13255: wrong docstrings in array module.
|
||||
|
||||
- Issue #9168: now smtpd is able to bind privileged port.
|
||||
|
|
|
@ -1314,14 +1314,18 @@ dict_fromkeys(PyObject *cls, PyObject *args)
|
|||
PyObject *key;
|
||||
Py_hash_t hash;
|
||||
|
||||
if (dictresize(mp, Py_SIZE(seq)))
|
||||
if (dictresize(mp, Py_SIZE(seq))) {
|
||||
Py_DECREF(d);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
|
||||
Py_INCREF(key);
|
||||
Py_INCREF(value);
|
||||
if (insertdict(mp, key, hash, value))
|
||||
if (insertdict(mp, key, hash, value)) {
|
||||
Py_DECREF(d);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
@ -1332,14 +1336,18 @@ dict_fromkeys(PyObject *cls, PyObject *args)
|
|||
PyObject *key;
|
||||
Py_hash_t hash;
|
||||
|
||||
if (dictresize(mp, PySet_GET_SIZE(seq)))
|
||||
if (dictresize(mp, PySet_GET_SIZE(seq))) {
|
||||
Py_DECREF(d);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
|
||||
Py_INCREF(key);
|
||||
Py_INCREF(value);
|
||||
if (insertdict(mp, key, hash, value))
|
||||
if (insertdict(mp, key, hash, value)) {
|
||||
Py_DECREF(d);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue