This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: Asyncore does not need to copy map.items() before polling
Type: Stage: resolved
Components: Library (Lib) Versions: Python 3.7, Python 3.6, Python 3.5, Python 2.7
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: Nir Soffer, vstinner
Priority: normal Keywords:

Created on 2017-07-23 00:15 by Nir Soffer, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 2819 closed nirs, 2017-07-23 00:28
Messages (5)
msg298880 - (view) Author: Nir Soffer (Nir Soffer) Date: 2017-07-23 00:15
Asyncore is not thread safe, and cannot be called from multiple threads. Hence it does not need to copy the socket_map when preparing for poll or

The copy was introduced in:

commit d74900ebb5a22b387b49684990da1925e1d6bdc9
Author: Josiah Carlson <>
Date:   Mon Jul 7 04:15:08 2008 +0000

    Committing Py3k version of changelist 64080 and 64257, along with updated tests
    for smtpd, which required updating with the new semantics.

This is a huge patch, looks like port of asyncore to python 3, trying to 
keep the behavior of the python 2 code.

Converting map.items() to list(map.items()) is correct, but on python 3 we
can take advantage of the fact that items() does not copy anything.
msg298905 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2017-07-23 13:09
Why it may be ok to avoid the copy, what is the advantage of applying the
change? The current code is correct.
msg299029 - (view) Author: Nir Soffer (Nir Soffer) Date: 2017-07-24 23:03
The advantage is avoiding wasteful copy on each iteration.
msg299031 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2017-07-24 23:16
asyncore is now deprecated and I prefer to restrict changes to minimum to avoid regressions. While the change makes sense, it only looks like a very cheap micro-optimization. I don't think that it's worth it.
msg299129 - (view) Author: Nir Soffer (Nir Soffer) Date: 2017-07-25 18:29
Using a quick test with 1000 clients sending 1000000 pings, I could not see
significant difference between master and this patch. Seems that the extra
copy is hidden by the noise.

Having this documented is good enough if someone want to use this.
Date User Action Args
2022-04-11 14:58:49adminsetgithub: 75177
2017-07-25 18:29:54Nir Soffersetstatus: open -> closed

messages: + msg299129
stage: resolved
2017-07-24 23:16:06vstinnersetmessages: + msg299031
2017-07-24 23:03:44Nir Soffersetnosy: + Nir Soffer
messages: + msg299029
2017-07-23 13:09:20vstinnersetnosy: + vstinner
messages: + msg298905
2017-07-23 06:44:45Kevin williamssetnosy: - vstinner, giampaolo.rodola, Nir Soffer
-> (no value)
2017-07-23 00:28:26nirssetpull_requests: + pull_request2872
2017-07-23 00:15:19Nir Soffercreate