mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
merge heads
This commit is contained in:
commit
9a1b956dea
4 changed files with 37 additions and 5 deletions
|
@ -321,7 +321,11 @@ class Pool(object):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _handle_workers(pool):
|
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()
|
pool._maintain_pool()
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
# send sentinel to stop workers
|
# send sentinel to stop workers
|
||||||
|
|
|
@ -1217,6 +1217,20 @@ class _TestPoolWorkerLifetime(BaseTestCase):
|
||||||
p.close()
|
p.close()
|
||||||
p.join()
|
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
|
# 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
|
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
|
- Issue #1294232: In a few cases involving metaclass inheritance, the
|
||||||
interpreter would sometimes invoke the wrong metaclass when building a new
|
interpreter would sometimes invoke the wrong metaclass when building a new
|
||||||
class object. These cases now behave correctly. Patch by Daniel Urban.
|
class object. These cases now behave correctly. Patch by Daniel Urban.
|
||||||
|
@ -58,6 +61,9 @@ Core and Builtins
|
||||||
Library
|
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 #13255: wrong docstrings in array module.
|
||||||
|
|
||||||
- Issue #9168: now smtpd is able to bind privileged port.
|
- Issue #9168: now smtpd is able to bind privileged port.
|
||||||
|
|
|
@ -1314,14 +1314,18 @@ dict_fromkeys(PyObject *cls, PyObject *args)
|
||||||
PyObject *key;
|
PyObject *key;
|
||||||
Py_hash_t hash;
|
Py_hash_t hash;
|
||||||
|
|
||||||
if (dictresize(mp, Py_SIZE(seq)))
|
if (dictresize(mp, Py_SIZE(seq))) {
|
||||||
|
Py_DECREF(d);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
|
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
|
||||||
Py_INCREF(key);
|
Py_INCREF(key);
|
||||||
Py_INCREF(value);
|
Py_INCREF(value);
|
||||||
if (insertdict(mp, key, hash, value))
|
if (insertdict(mp, key, hash, value)) {
|
||||||
|
Py_DECREF(d);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
@ -1332,14 +1336,18 @@ dict_fromkeys(PyObject *cls, PyObject *args)
|
||||||
PyObject *key;
|
PyObject *key;
|
||||||
Py_hash_t hash;
|
Py_hash_t hash;
|
||||||
|
|
||||||
if (dictresize(mp, PySet_GET_SIZE(seq)))
|
if (dictresize(mp, PySet_GET_SIZE(seq))) {
|
||||||
|
Py_DECREF(d);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
|
while (_PySet_NextEntry(seq, &pos, &key, &hash)) {
|
||||||
Py_INCREF(key);
|
Py_INCREF(key);
|
||||||
Py_INCREF(value);
|
Py_INCREF(value);
|
||||||
if (insertdict(mp, key, hash, value))
|
if (insertdict(mp, key, hash, value)) {
|
||||||
|
Py_DECREF(d);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue