@rowstile/cli-linux-x64 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +5 -0
- package/package.json +26 -0
- package/python/bin/python3.13 +0 -0
- package/python/bin/python3.13-config +122 -0
- package/python/lib/libpython3.13.so.1.0 +0 -0
- package/python/lib/libpython3.so +0 -0
- package/python/lib/python3.13/LICENSE.txt +277 -0
- package/python/lib/python3.13/__future__.py +147 -0
- package/python/lib/python3.13/__hello__.py +16 -0
- package/python/lib/python3.13/_aix_support.py +108 -0
- package/python/lib/python3.13/_android_support.py +192 -0
- package/python/lib/python3.13/_apple_support.py +66 -0
- package/python/lib/python3.13/_collections_abc.py +1187 -0
- package/python/lib/python3.13/_colorize.py +119 -0
- package/python/lib/python3.13/_compat_pickle.py +251 -0
- package/python/lib/python3.13/_compression.py +162 -0
- package/python/lib/python3.13/_ios_support.py +71 -0
- package/python/lib/python3.13/_markupbase.py +396 -0
- package/python/lib/python3.13/_opcode_metadata.py +343 -0
- package/python/lib/python3.13/_osx_support.py +579 -0
- package/python/lib/python3.13/_py_abc.py +147 -0
- package/python/lib/python3.13/_pydatetime.py +2640 -0
- package/python/lib/python3.13/_pydecimal.py +6356 -0
- package/python/lib/python3.13/_pyio.py +2714 -0
- package/python/lib/python3.13/_pylong.py +363 -0
- package/python/lib/python3.13/_pyrepl/__init__.py +19 -0
- package/python/lib/python3.13/_pyrepl/__main__.py +10 -0
- package/python/lib/python3.13/_pyrepl/_minimal_curses.py +68 -0
- package/python/lib/python3.13/_pyrepl/_threading_handler.py +74 -0
- package/python/lib/python3.13/_pyrepl/base_eventqueue.py +110 -0
- package/python/lib/python3.13/_pyrepl/commands.py +492 -0
- package/python/lib/python3.13/_pyrepl/completing_reader.py +295 -0
- package/python/lib/python3.13/_pyrepl/console.py +229 -0
- package/python/lib/python3.13/_pyrepl/curses.py +33 -0
- package/python/lib/python3.13/_pyrepl/fancy_termios.py +82 -0
- package/python/lib/python3.13/_pyrepl/historical_reader.py +419 -0
- package/python/lib/python3.13/_pyrepl/input.py +114 -0
- package/python/lib/python3.13/_pyrepl/keymap.py +213 -0
- package/python/lib/python3.13/_pyrepl/main.py +59 -0
- package/python/lib/python3.13/_pyrepl/mypy.ini +29 -0
- package/python/lib/python3.13/_pyrepl/pager.py +175 -0
- package/python/lib/python3.13/_pyrepl/reader.py +764 -0
- package/python/lib/python3.13/_pyrepl/readline.py +599 -0
- package/python/lib/python3.13/_pyrepl/simple_interact.py +180 -0
- package/python/lib/python3.13/_pyrepl/trace.py +21 -0
- package/python/lib/python3.13/_pyrepl/types.py +10 -0
- package/python/lib/python3.13/_pyrepl/unix_console.py +852 -0
- package/python/lib/python3.13/_pyrepl/unix_eventqueue.py +76 -0
- package/python/lib/python3.13/_pyrepl/utils.py +83 -0
- package/python/lib/python3.13/_pyrepl/windows_console.py +687 -0
- package/python/lib/python3.13/_pyrepl/windows_eventqueue.py +42 -0
- package/python/lib/python3.13/_sitebuiltins.py +91 -0
- package/python/lib/python3.13/_strptime.py +800 -0
- package/python/lib/python3.13/_sysconfigdata__linux_x86_64-linux-gnu.py +1079 -0
- package/python/lib/python3.13/_threading_local.py +120 -0
- package/python/lib/python3.13/_weakrefset.py +205 -0
- package/python/lib/python3.13/abc.py +188 -0
- package/python/lib/python3.13/antigravity.py +17 -0
- package/python/lib/python3.13/argparse.py +2690 -0
- package/python/lib/python3.13/ast.py +1865 -0
- package/python/lib/python3.13/asyncio/__init__.py +47 -0
- package/python/lib/python3.13/asyncio/__main__.py +211 -0
- package/python/lib/python3.13/asyncio/base_events.py +2086 -0
- package/python/lib/python3.13/asyncio/base_futures.py +67 -0
- package/python/lib/python3.13/asyncio/base_subprocess.py +312 -0
- package/python/lib/python3.13/asyncio/base_tasks.py +94 -0
- package/python/lib/python3.13/asyncio/constants.py +41 -0
- package/python/lib/python3.13/asyncio/coroutines.py +109 -0
- package/python/lib/python3.13/asyncio/events.py +885 -0
- package/python/lib/python3.13/asyncio/exceptions.py +62 -0
- package/python/lib/python3.13/asyncio/format_helpers.py +84 -0
- package/python/lib/python3.13/asyncio/futures.py +425 -0
- package/python/lib/python3.13/asyncio/locks.py +617 -0
- package/python/lib/python3.13/asyncio/log.py +7 -0
- package/python/lib/python3.13/asyncio/mixins.py +21 -0
- package/python/lib/python3.13/asyncio/proactor_events.py +891 -0
- package/python/lib/python3.13/asyncio/protocols.py +216 -0
- package/python/lib/python3.13/asyncio/queues.py +309 -0
- package/python/lib/python3.13/asyncio/runners.py +217 -0
- package/python/lib/python3.13/asyncio/selector_events.py +1328 -0
- package/python/lib/python3.13/asyncio/sslproto.py +929 -0
- package/python/lib/python3.13/asyncio/staggered.py +174 -0
- package/python/lib/python3.13/asyncio/streams.py +787 -0
- package/python/lib/python3.13/asyncio/subprocess.py +229 -0
- package/python/lib/python3.13/asyncio/taskgroups.py +278 -0
- package/python/lib/python3.13/asyncio/tasks.py +1121 -0
- package/python/lib/python3.13/asyncio/threads.py +26 -0
- package/python/lib/python3.13/asyncio/timeouts.py +185 -0
- package/python/lib/python3.13/asyncio/transports.py +337 -0
- package/python/lib/python3.13/asyncio/trsock.py +98 -0
- package/python/lib/python3.13/asyncio/unix_events.py +1550 -0
- package/python/lib/python3.13/asyncio/windows_events.py +906 -0
- package/python/lib/python3.13/asyncio/windows_utils.py +181 -0
- package/python/lib/python3.13/base64.py +628 -0
- package/python/lib/python3.13/bdb.py +973 -0
- package/python/lib/python3.13/bisect.py +118 -0
- package/python/lib/python3.13/bz2.py +352 -0
- package/python/lib/python3.13/cProfile.py +197 -0
- package/python/lib/python3.13/calendar.py +813 -0
- package/python/lib/python3.13/cmd.py +409 -0
- package/python/lib/python3.13/code.py +386 -0
- package/python/lib/python3.13/codecs.py +1132 -0
- package/python/lib/python3.13/codeop.py +155 -0
- package/python/lib/python3.13/collections/__init__.py +1603 -0
- package/python/lib/python3.13/colorsys.py +166 -0
- package/python/lib/python3.13/compileall.py +470 -0
- package/python/lib/python3.13/concurrent/__init__.py +1 -0
- package/python/lib/python3.13/concurrent/futures/__init__.py +54 -0
- package/python/lib/python3.13/concurrent/futures/_base.py +660 -0
- package/python/lib/python3.13/concurrent/futures/process.py +892 -0
- package/python/lib/python3.13/concurrent/futures/thread.py +240 -0
- package/python/lib/python3.13/configparser.py +1396 -0
- package/python/lib/python3.13/contextlib.py +814 -0
- package/python/lib/python3.13/contextvars.py +4 -0
- package/python/lib/python3.13/copy.py +306 -0
- package/python/lib/python3.13/copyreg.py +217 -0
- package/python/lib/python3.13/csv.py +527 -0
- package/python/lib/python3.13/ctypes/__init__.py +605 -0
- package/python/lib/python3.13/ctypes/_aix.py +327 -0
- package/python/lib/python3.13/ctypes/_endian.py +78 -0
- package/python/lib/python3.13/ctypes/macholib/README.ctypes +7 -0
- package/python/lib/python3.13/ctypes/macholib/__init__.py +9 -0
- package/python/lib/python3.13/ctypes/macholib/dyld.py +165 -0
- package/python/lib/python3.13/ctypes/macholib/dylib.py +42 -0
- package/python/lib/python3.13/ctypes/macholib/fetch_macholib +2 -0
- package/python/lib/python3.13/ctypes/macholib/fetch_macholib.bat +1 -0
- package/python/lib/python3.13/ctypes/macholib/framework.py +42 -0
- package/python/lib/python3.13/ctypes/util.py +387 -0
- package/python/lib/python3.13/ctypes/wintypes.py +202 -0
- package/python/lib/python3.13/curses/__init__.py +101 -0
- package/python/lib/python3.13/curses/ascii.py +99 -0
- package/python/lib/python3.13/curses/has_key.py +192 -0
- package/python/lib/python3.13/curses/panel.py +6 -0
- package/python/lib/python3.13/curses/textpad.py +236 -0
- package/python/lib/python3.13/dataclasses.py +1679 -0
- package/python/lib/python3.13/datetime.py +9 -0
- package/python/lib/python3.13/dbm/__init__.py +194 -0
- package/python/lib/python3.13/dbm/dumb.py +319 -0
- package/python/lib/python3.13/dbm/gnu.py +3 -0
- package/python/lib/python3.13/dbm/ndbm.py +3 -0
- package/python/lib/python3.13/dbm/sqlite3.py +144 -0
- package/python/lib/python3.13/decimal.py +109 -0
- package/python/lib/python3.13/difflib.py +2058 -0
- package/python/lib/python3.13/dis.py +1075 -0
- package/python/lib/python3.13/doctest.py +2919 -0
- package/python/lib/python3.13/email/__init__.py +61 -0
- package/python/lib/python3.13/email/_encoded_words.py +233 -0
- package/python/lib/python3.13/email/_header_value_parser.py +3153 -0
- package/python/lib/python3.13/email/_parseaddr.py +563 -0
- package/python/lib/python3.13/email/_policybase.py +382 -0
- package/python/lib/python3.13/email/architecture.rst +216 -0
- package/python/lib/python3.13/email/base64mime.py +115 -0
- package/python/lib/python3.13/email/charset.py +396 -0
- package/python/lib/python3.13/email/contentmanager.py +254 -0
- package/python/lib/python3.13/email/encoders.py +65 -0
- package/python/lib/python3.13/email/errors.py +117 -0
- package/python/lib/python3.13/email/feedparser.py +536 -0
- package/python/lib/python3.13/email/generator.py +530 -0
- package/python/lib/python3.13/email/header.py +582 -0
- package/python/lib/python3.13/email/headerregistry.py +618 -0
- package/python/lib/python3.13/email/iterators.py +68 -0
- package/python/lib/python3.13/email/message.py +1217 -0
- package/python/lib/python3.13/email/mime/__init__.py +0 -0
- package/python/lib/python3.13/email/mime/application.py +37 -0
- package/python/lib/python3.13/email/mime/audio.py +97 -0
- package/python/lib/python3.13/email/mime/base.py +29 -0
- package/python/lib/python3.13/email/mime/image.py +152 -0
- package/python/lib/python3.13/email/mime/message.py +33 -0
- package/python/lib/python3.13/email/mime/multipart.py +47 -0
- package/python/lib/python3.13/email/mime/nonmultipart.py +21 -0
- package/python/lib/python3.13/email/mime/text.py +40 -0
- package/python/lib/python3.13/email/parser.py +127 -0
- package/python/lib/python3.13/email/policy.py +232 -0
- package/python/lib/python3.13/email/quoprimime.py +300 -0
- package/python/lib/python3.13/email/utils.py +497 -0
- package/python/lib/python3.13/encodings/__init__.py +179 -0
- package/python/lib/python3.13/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/lib/python3.13/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
- package/python/lib/python3.13/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
- package/python/lib/python3.13/encodings/aliases.py +560 -0
- package/python/lib/python3.13/encodings/ascii.py +50 -0
- package/python/lib/python3.13/encodings/base64_codec.py +55 -0
- package/python/lib/python3.13/encodings/big5.py +39 -0
- package/python/lib/python3.13/encodings/big5hkscs.py +39 -0
- package/python/lib/python3.13/encodings/bz2_codec.py +78 -0
- package/python/lib/python3.13/encodings/charmap.py +69 -0
- package/python/lib/python3.13/encodings/cp037.py +307 -0
- package/python/lib/python3.13/encodings/cp1006.py +307 -0
- package/python/lib/python3.13/encodings/cp1026.py +307 -0
- package/python/lib/python3.13/encodings/cp1125.py +698 -0
- package/python/lib/python3.13/encodings/cp1140.py +307 -0
- package/python/lib/python3.13/encodings/cp1250.py +307 -0
- package/python/lib/python3.13/encodings/cp1251.py +307 -0
- package/python/lib/python3.13/encodings/cp1252.py +307 -0
- package/python/lib/python3.13/encodings/cp1253.py +307 -0
- package/python/lib/python3.13/encodings/cp1254.py +307 -0
- package/python/lib/python3.13/encodings/cp1255.py +307 -0
- package/python/lib/python3.13/encodings/cp1256.py +307 -0
- package/python/lib/python3.13/encodings/cp1257.py +307 -0
- package/python/lib/python3.13/encodings/cp1258.py +307 -0
- package/python/lib/python3.13/encodings/cp273.py +307 -0
- package/python/lib/python3.13/encodings/cp424.py +307 -0
- package/python/lib/python3.13/encodings/cp437.py +698 -0
- package/python/lib/python3.13/encodings/cp500.py +307 -0
- package/python/lib/python3.13/encodings/cp720.py +309 -0
- package/python/lib/python3.13/encodings/cp737.py +698 -0
- package/python/lib/python3.13/encodings/cp775.py +697 -0
- package/python/lib/python3.13/encodings/cp850.py +698 -0
- package/python/lib/python3.13/encodings/cp852.py +698 -0
- package/python/lib/python3.13/encodings/cp855.py +698 -0
- package/python/lib/python3.13/encodings/cp856.py +307 -0
- package/python/lib/python3.13/encodings/cp857.py +694 -0
- package/python/lib/python3.13/encodings/cp858.py +698 -0
- package/python/lib/python3.13/encodings/cp860.py +698 -0
- package/python/lib/python3.13/encodings/cp861.py +698 -0
- package/python/lib/python3.13/encodings/cp862.py +698 -0
- package/python/lib/python3.13/encodings/cp863.py +698 -0
- package/python/lib/python3.13/encodings/cp864.py +690 -0
- package/python/lib/python3.13/encodings/cp865.py +698 -0
- package/python/lib/python3.13/encodings/cp866.py +698 -0
- package/python/lib/python3.13/encodings/cp869.py +689 -0
- package/python/lib/python3.13/encodings/cp874.py +307 -0
- package/python/lib/python3.13/encodings/cp875.py +307 -0
- package/python/lib/python3.13/encodings/cp932.py +39 -0
- package/python/lib/python3.13/encodings/cp949.py +39 -0
- package/python/lib/python3.13/encodings/cp950.py +39 -0
- package/python/lib/python3.13/encodings/euc_jis_2004.py +39 -0
- package/python/lib/python3.13/encodings/euc_jisx0213.py +39 -0
- package/python/lib/python3.13/encodings/euc_jp.py +39 -0
- package/python/lib/python3.13/encodings/euc_kr.py +39 -0
- package/python/lib/python3.13/encodings/gb18030.py +39 -0
- package/python/lib/python3.13/encodings/gb2312.py +39 -0
- package/python/lib/python3.13/encodings/gbk.py +39 -0
- package/python/lib/python3.13/encodings/hex_codec.py +55 -0
- package/python/lib/python3.13/encodings/hp_roman8.py +314 -0
- package/python/lib/python3.13/encodings/hz.py +39 -0
- package/python/lib/python3.13/encodings/idna.py +387 -0
- package/python/lib/python3.13/encodings/iso2022_jp.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_1.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_2.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_2004.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_3.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_jp_ext.py +39 -0
- package/python/lib/python3.13/encodings/iso2022_kr.py +39 -0
- package/python/lib/python3.13/encodings/iso8859_1.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_10.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_11.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_13.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_14.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_15.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_16.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_2.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_3.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_4.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_5.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_6.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_7.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_8.py +307 -0
- package/python/lib/python3.13/encodings/iso8859_9.py +307 -0
- package/python/lib/python3.13/encodings/johab.py +39 -0
- package/python/lib/python3.13/encodings/koi8_r.py +307 -0
- package/python/lib/python3.13/encodings/koi8_t.py +308 -0
- package/python/lib/python3.13/encodings/koi8_u.py +307 -0
- package/python/lib/python3.13/encodings/kz1048.py +307 -0
- package/python/lib/python3.13/encodings/latin_1.py +50 -0
- package/python/lib/python3.13/encodings/mac_arabic.py +698 -0
- package/python/lib/python3.13/encodings/mac_croatian.py +307 -0
- package/python/lib/python3.13/encodings/mac_cyrillic.py +307 -0
- package/python/lib/python3.13/encodings/mac_farsi.py +307 -0
- package/python/lib/python3.13/encodings/mac_greek.py +307 -0
- package/python/lib/python3.13/encodings/mac_iceland.py +307 -0
- package/python/lib/python3.13/encodings/mac_latin2.py +312 -0
- package/python/lib/python3.13/encodings/mac_roman.py +307 -0
- package/python/lib/python3.13/encodings/mac_romanian.py +307 -0
- package/python/lib/python3.13/encodings/mac_turkish.py +307 -0
- package/python/lib/python3.13/encodings/mbcs.py +47 -0
- package/python/lib/python3.13/encodings/oem.py +41 -0
- package/python/lib/python3.13/encodings/palmos.py +308 -0
- package/python/lib/python3.13/encodings/ptcp154.py +312 -0
- package/python/lib/python3.13/encodings/punycode.py +253 -0
- package/python/lib/python3.13/encodings/quopri_codec.py +56 -0
- package/python/lib/python3.13/encodings/raw_unicode_escape.py +46 -0
- package/python/lib/python3.13/encodings/rot_13.py +113 -0
- package/python/lib/python3.13/encodings/shift_jis.py +39 -0
- package/python/lib/python3.13/encodings/shift_jis_2004.py +39 -0
- package/python/lib/python3.13/encodings/shift_jisx0213.py +39 -0
- package/python/lib/python3.13/encodings/tis_620.py +307 -0
- package/python/lib/python3.13/encodings/undefined.py +49 -0
- package/python/lib/python3.13/encodings/unicode_escape.py +46 -0
- package/python/lib/python3.13/encodings/utf_16.py +155 -0
- package/python/lib/python3.13/encodings/utf_16_be.py +42 -0
- package/python/lib/python3.13/encodings/utf_16_le.py +42 -0
- package/python/lib/python3.13/encodings/utf_32.py +150 -0
- package/python/lib/python3.13/encodings/utf_32_be.py +37 -0
- package/python/lib/python3.13/encodings/utf_32_le.py +37 -0
- package/python/lib/python3.13/encodings/utf_7.py +38 -0
- package/python/lib/python3.13/encodings/utf_8.py +42 -0
- package/python/lib/python3.13/encodings/utf_8_sig.py +130 -0
- package/python/lib/python3.13/encodings/uu_codec.py +103 -0
- package/python/lib/python3.13/encodings/zlib_codec.py +77 -0
- package/python/lib/python3.13/enum.py +2183 -0
- package/python/lib/python3.13/filecmp.py +320 -0
- package/python/lib/python3.13/fileinput.py +442 -0
- package/python/lib/python3.13/fnmatch.py +192 -0
- package/python/lib/python3.13/fractions.py +1043 -0
- package/python/lib/python3.13/ftplib.py +975 -0
- package/python/lib/python3.13/functools.py +1036 -0
- package/python/lib/python3.13/genericpath.py +200 -0
- package/python/lib/python3.13/getopt.py +215 -0
- package/python/lib/python3.13/getpass.py +192 -0
- package/python/lib/python3.13/gettext.py +657 -0
- package/python/lib/python3.13/glob.py +572 -0
- package/python/lib/python3.13/graphlib.py +250 -0
- package/python/lib/python3.13/gzip.py +693 -0
- package/python/lib/python3.13/hashlib.py +255 -0
- package/python/lib/python3.13/heapq.py +603 -0
- package/python/lib/python3.13/hmac.py +220 -0
- package/python/lib/python3.13/html/__init__.py +132 -0
- package/python/lib/python3.13/html/entities.py +2513 -0
- package/python/lib/python3.13/html/parser.py +583 -0
- package/python/lib/python3.13/http/__init__.py +202 -0
- package/python/lib/python3.13/http/client.py +1598 -0
- package/python/lib/python3.13/http/cookiejar.py +2122 -0
- package/python/lib/python3.13/http/cookies.py +635 -0
- package/python/lib/python3.13/http/server.py +1355 -0
- package/python/lib/python3.13/imaplib.py +1769 -0
- package/python/lib/python3.13/importlib/__init__.py +136 -0
- package/python/lib/python3.13/importlib/_abc.py +39 -0
- package/python/lib/python3.13/importlib/_bootstrap.py +1559 -0
- package/python/lib/python3.13/importlib/_bootstrap_external.py +1826 -0
- package/python/lib/python3.13/importlib/abc.py +243 -0
- package/python/lib/python3.13/importlib/machinery.py +21 -0
- package/python/lib/python3.13/importlib/metadata/__init__.py +1093 -0
- package/python/lib/python3.13/importlib/metadata/_adapters.py +89 -0
- package/python/lib/python3.13/importlib/metadata/_collections.py +30 -0
- package/python/lib/python3.13/importlib/metadata/_functools.py +104 -0
- package/python/lib/python3.13/importlib/metadata/_itertools.py +73 -0
- package/python/lib/python3.13/importlib/metadata/_meta.py +67 -0
- package/python/lib/python3.13/importlib/metadata/_text.py +99 -0
- package/python/lib/python3.13/importlib/metadata/diagnose.py +21 -0
- package/python/lib/python3.13/importlib/readers.py +12 -0
- package/python/lib/python3.13/importlib/resources/__init__.py +43 -0
- package/python/lib/python3.13/importlib/resources/_adapters.py +168 -0
- package/python/lib/python3.13/importlib/resources/_common.py +211 -0
- package/python/lib/python3.13/importlib/resources/_functional.py +81 -0
- package/python/lib/python3.13/importlib/resources/_itertools.py +38 -0
- package/python/lib/python3.13/importlib/resources/abc.py +173 -0
- package/python/lib/python3.13/importlib/resources/readers.py +203 -0
- package/python/lib/python3.13/importlib/resources/simple.py +106 -0
- package/python/lib/python3.13/importlib/simple.py +14 -0
- package/python/lib/python3.13/importlib/util.py +274 -0
- package/python/lib/python3.13/inspect.py +3479 -0
- package/python/lib/python3.13/io.py +99 -0
- package/python/lib/python3.13/ipaddress.py +2440 -0
- package/python/lib/python3.13/json/__init__.py +365 -0
- package/python/lib/python3.13/json/decoder.py +364 -0
- package/python/lib/python3.13/json/encoder.py +446 -0
- package/python/lib/python3.13/json/scanner.py +73 -0
- package/python/lib/python3.13/json/tool.py +90 -0
- package/python/lib/python3.13/keyword.py +64 -0
- package/python/lib/python3.13/lib-dynload/.empty +0 -0
- package/python/lib/python3.13/lib-dynload/_dbm.cpython-313-x86_64-linux-gnu.so +0 -0
- package/python/lib/python3.13/linecache.py +236 -0
- package/python/lib/python3.13/locale.py +1987 -0
- package/python/lib/python3.13/logging/__init__.py +2330 -0
- package/python/lib/python3.13/logging/config.py +1080 -0
- package/python/lib/python3.13/logging/handlers.py +1629 -0
- package/python/lib/python3.13/lzma.py +364 -0
- package/python/lib/python3.13/mailbox.py +2219 -0
- package/python/lib/python3.13/mimetypes.py +679 -0
- package/python/lib/python3.13/modulefinder.py +671 -0
- package/python/lib/python3.13/multiprocessing/__init__.py +37 -0
- package/python/lib/python3.13/multiprocessing/connection.py +1216 -0
- package/python/lib/python3.13/multiprocessing/context.py +383 -0
- package/python/lib/python3.13/multiprocessing/dummy/__init__.py +126 -0
- package/python/lib/python3.13/multiprocessing/dummy/connection.py +75 -0
- package/python/lib/python3.13/multiprocessing/forkserver.py +373 -0
- package/python/lib/python3.13/multiprocessing/heap.py +337 -0
- package/python/lib/python3.13/multiprocessing/managers.py +1397 -0
- package/python/lib/python3.13/multiprocessing/pool.py +957 -0
- package/python/lib/python3.13/multiprocessing/popen_fork.py +97 -0
- package/python/lib/python3.13/multiprocessing/popen_forkserver.py +74 -0
- package/python/lib/python3.13/multiprocessing/popen_spawn_posix.py +76 -0
- package/python/lib/python3.13/multiprocessing/popen_spawn_win32.py +147 -0
- package/python/lib/python3.13/multiprocessing/process.py +436 -0
- package/python/lib/python3.13/multiprocessing/queues.py +399 -0
- package/python/lib/python3.13/multiprocessing/reduction.py +281 -0
- package/python/lib/python3.13/multiprocessing/resource_sharer.py +154 -0
- package/python/lib/python3.13/multiprocessing/resource_tracker.py +499 -0
- package/python/lib/python3.13/multiprocessing/shared_memory.py +544 -0
- package/python/lib/python3.13/multiprocessing/sharedctypes.py +240 -0
- package/python/lib/python3.13/multiprocessing/spawn.py +307 -0
- package/python/lib/python3.13/multiprocessing/synchronize.py +404 -0
- package/python/lib/python3.13/multiprocessing/util.py +562 -0
- package/python/lib/python3.13/netrc.py +199 -0
- package/python/lib/python3.13/ntpath.py +872 -0
- package/python/lib/python3.13/nturl2path.py +69 -0
- package/python/lib/python3.13/numbers.py +427 -0
- package/python/lib/python3.13/opcode.py +115 -0
- package/python/lib/python3.13/operator.py +467 -0
- package/python/lib/python3.13/optparse.py +1681 -0
- package/python/lib/python3.13/os.py +1184 -0
- package/python/lib/python3.13/pathlib/__init__.py +12 -0
- package/python/lib/python3.13/pathlib/_abc.py +930 -0
- package/python/lib/python3.13/pathlib/_local.py +861 -0
- package/python/lib/python3.13/pdb.py +2550 -0
- package/python/lib/python3.13/pickle.py +1860 -0
- package/python/lib/python3.13/pickletools.py +2904 -0
- package/python/lib/python3.13/pkgutil.py +529 -0
- package/python/lib/python3.13/platform.py +1454 -0
- package/python/lib/python3.13/plistlib.py +948 -0
- package/python/lib/python3.13/poplib.py +477 -0
- package/python/lib/python3.13/posixpath.py +578 -0
- package/python/lib/python3.13/pprint.py +658 -0
- package/python/lib/python3.13/profile.py +616 -0
- package/python/lib/python3.13/pstats.py +778 -0
- package/python/lib/python3.13/pty.py +211 -0
- package/python/lib/python3.13/py_compile.py +212 -0
- package/python/lib/python3.13/pyclbr.py +314 -0
- package/python/lib/python3.13/pydoc.py +2861 -0
- package/python/lib/python3.13/queue.py +383 -0
- package/python/lib/python3.13/quopri.py +237 -0
- package/python/lib/python3.13/random.py +1078 -0
- package/python/lib/python3.13/re/__init__.py +428 -0
- package/python/lib/python3.13/re/_casefix.py +106 -0
- package/python/lib/python3.13/re/_compiler.py +768 -0
- package/python/lib/python3.13/re/_constants.py +222 -0
- package/python/lib/python3.13/re/_parser.py +1081 -0
- package/python/lib/python3.13/reprlib.py +230 -0
- package/python/lib/python3.13/rlcompleter.py +222 -0
- package/python/lib/python3.13/runpy.py +326 -0
- package/python/lib/python3.13/sched.py +167 -0
- package/python/lib/python3.13/secrets.py +71 -0
- package/python/lib/python3.13/selectors.py +603 -0
- package/python/lib/python3.13/shelve.py +250 -0
- package/python/lib/python3.13/shlex.py +345 -0
- package/python/lib/python3.13/shutil.py +1569 -0
- package/python/lib/python3.13/signal.py +94 -0
- package/python/lib/python3.13/site.py +773 -0
- package/python/lib/python3.13/smtplib.py +1123 -0
- package/python/lib/python3.13/socket.py +988 -0
- package/python/lib/python3.13/socketserver.py +863 -0
- package/python/lib/python3.13/sqlite3/__init__.py +70 -0
- package/python/lib/python3.13/sqlite3/__main__.py +139 -0
- package/python/lib/python3.13/sqlite3/dbapi2.py +108 -0
- package/python/lib/python3.13/sqlite3/dump.py +118 -0
- package/python/lib/python3.13/sre_compile.py +7 -0
- package/python/lib/python3.13/sre_constants.py +7 -0
- package/python/lib/python3.13/sre_parse.py +7 -0
- package/python/lib/python3.13/ssl.py +1541 -0
- package/python/lib/python3.13/stat.py +212 -0
- package/python/lib/python3.13/statistics.py +1817 -0
- package/python/lib/python3.13/string.py +314 -0
- package/python/lib/python3.13/stringprep.py +272 -0
- package/python/lib/python3.13/struct.py +15 -0
- package/python/lib/python3.13/subprocess.py +2258 -0
- package/python/lib/python3.13/symtable.py +414 -0
- package/python/lib/python3.13/sysconfig/__init__.py +734 -0
- package/python/lib/python3.13/sysconfig/__main__.py +248 -0
- package/python/lib/python3.13/tabnanny.py +340 -0
- package/python/lib/python3.13/tarfile.py +3136 -0
- package/python/lib/python3.13/tempfile.py +958 -0
- package/python/lib/python3.13/textwrap.py +497 -0
- package/python/lib/python3.13/this.py +28 -0
- package/python/lib/python3.13/threading.py +1602 -0
- package/python/lib/python3.13/timeit.py +381 -0
- package/python/lib/python3.13/token.py +141 -0
- package/python/lib/python3.13/tokenize.py +592 -0
- package/python/lib/python3.13/tomllib/__init__.py +10 -0
- package/python/lib/python3.13/tomllib/_parser.py +703 -0
- package/python/lib/python3.13/tomllib/_re.py +107 -0
- package/python/lib/python3.13/tomllib/_types.py +10 -0
- package/python/lib/python3.13/tomllib/mypy.ini +15 -0
- package/python/lib/python3.13/trace.py +754 -0
- package/python/lib/python3.13/traceback.py +1639 -0
- package/python/lib/python3.13/tracemalloc.py +560 -0
- package/python/lib/python3.13/tty.py +73 -0
- package/python/lib/python3.13/types.py +346 -0
- package/python/lib/python3.13/typing.py +3846 -0
- package/python/lib/python3.13/unittest/__init__.py +80 -0
- package/python/lib/python3.13/unittest/__main__.py +18 -0
- package/python/lib/python3.13/unittest/_log.py +86 -0
- package/python/lib/python3.13/unittest/async_case.py +146 -0
- package/python/lib/python3.13/unittest/case.py +1478 -0
- package/python/lib/python3.13/unittest/loader.py +460 -0
- package/python/lib/python3.13/unittest/main.py +280 -0
- package/python/lib/python3.13/unittest/mock.py +3189 -0
- package/python/lib/python3.13/unittest/result.py +256 -0
- package/python/lib/python3.13/unittest/runner.py +292 -0
- package/python/lib/python3.13/unittest/signals.py +71 -0
- package/python/lib/python3.13/unittest/suite.py +379 -0
- package/python/lib/python3.13/unittest/util.py +170 -0
- package/python/lib/python3.13/urllib/__init__.py +0 -0
- package/python/lib/python3.13/urllib/error.py +74 -0
- package/python/lib/python3.13/urllib/parse.py +1264 -0
- package/python/lib/python3.13/urllib/request.py +2796 -0
- package/python/lib/python3.13/urllib/response.py +84 -0
- package/python/lib/python3.13/urllib/robotparser.py +363 -0
- package/python/lib/python3.13/uuid.py +784 -0
- package/python/lib/python3.13/warnings.py +735 -0
- package/python/lib/python3.13/wave.py +665 -0
- package/python/lib/python3.13/weakref.py +674 -0
- package/python/lib/python3.13/webbrowser.py +724 -0
- package/python/lib/python3.13/wsgiref/__init__.py +25 -0
- package/python/lib/python3.13/wsgiref/handlers.py +575 -0
- package/python/lib/python3.13/wsgiref/headers.py +192 -0
- package/python/lib/python3.13/wsgiref/simple_server.py +161 -0
- package/python/lib/python3.13/wsgiref/types.py +54 -0
- package/python/lib/python3.13/wsgiref/util.py +159 -0
- package/python/lib/python3.13/wsgiref/validate.py +438 -0
- package/python/lib/python3.13/xml/__init__.py +20 -0
- package/python/lib/python3.13/xml/dom/NodeFilter.py +27 -0
- package/python/lib/python3.13/xml/dom/__init__.py +140 -0
- package/python/lib/python3.13/xml/dom/domreg.py +99 -0
- package/python/lib/python3.13/xml/dom/expatbuilder.py +962 -0
- package/python/lib/python3.13/xml/dom/minicompat.py +109 -0
- package/python/lib/python3.13/xml/dom/minidom.py +2024 -0
- package/python/lib/python3.13/xml/dom/pulldom.py +336 -0
- package/python/lib/python3.13/xml/dom/xmlbuilder.py +389 -0
- package/python/lib/python3.13/xml/etree/ElementInclude.py +186 -0
- package/python/lib/python3.13/xml/etree/ElementPath.py +430 -0
- package/python/lib/python3.13/xml/etree/ElementTree.py +2116 -0
- package/python/lib/python3.13/xml/etree/__init__.py +33 -0
- package/python/lib/python3.13/xml/etree/cElementTree.py +3 -0
- package/python/lib/python3.13/xml/parsers/__init__.py +8 -0
- package/python/lib/python3.13/xml/parsers/expat.py +8 -0
- package/python/lib/python3.13/xml/sax/__init__.py +94 -0
- package/python/lib/python3.13/xml/sax/_exceptions.py +127 -0
- package/python/lib/python3.13/xml/sax/expatreader.py +454 -0
- package/python/lib/python3.13/xml/sax/handler.py +387 -0
- package/python/lib/python3.13/xml/sax/saxutils.py +369 -0
- package/python/lib/python3.13/xml/sax/xmlreader.py +378 -0
- package/python/lib/python3.13/xmlrpc/__init__.py +1 -0
- package/python/lib/python3.13/xmlrpc/client.py +1503 -0
- package/python/lib/python3.13/xmlrpc/server.py +1002 -0
- package/python/lib/python3.13/zipapp.py +229 -0
- package/python/lib/python3.13/zipfile/__init__.py +2391 -0
- package/python/lib/python3.13/zipfile/__main__.py +4 -0
- package/python/lib/python3.13/zipfile/_path/__init__.py +452 -0
- package/python/lib/python3.13/zipfile/_path/glob.py +113 -0
- package/python/lib/python3.13/zipimport.py +803 -0
- package/python/lib/python3.13/zoneinfo/__init__.py +34 -0
- package/python/lib/python3.13/zoneinfo/_common.py +172 -0
- package/python/lib/python3.13/zoneinfo/_tzpath.py +189 -0
- package/python/lib/python3.13/zoneinfo/_zoneinfo.py +779 -0
- package/python/licenses/LICENSE.bdb.txt +126 -0
- package/python/licenses/LICENSE.bzip2.txt +37 -0
- package/python/licenses/LICENSE.cpython.txt +771 -0
- package/python/licenses/LICENSE.expat.txt +21 -0
- package/python/licenses/LICENSE.libX11.txt +942 -0
- package/python/licenses/LICENSE.libXau.txt +21 -0
- package/python/licenses/LICENSE.libedit.txt +29 -0
- package/python/licenses/LICENSE.libffi.txt +21 -0
- package/python/licenses/LICENSE.liblzma.txt +13 -0
- package/python/licenses/LICENSE.libuuid.txt +27 -0
- package/python/licenses/LICENSE.libxcb.txt +30 -0
- package/python/licenses/LICENSE.mpdecimal.txt +24 -0
- package/python/licenses/LICENSE.ncurses.txt +29 -0
- package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
- package/python/licenses/LICENSE.openssl-3.txt +177 -0
- package/python/licenses/LICENSE.sqlite.txt +23 -0
- package/python/licenses/LICENSE.tcl.txt +40 -0
- package/python/licenses/LICENSE.tix.txt +54 -0
- package/python/licenses/LICENSE.zlib.txt +21 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Module implementing queues
|
|
3
|
+
#
|
|
4
|
+
# multiprocessing/queues.py
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006-2008, R Oudkerk
|
|
7
|
+
# Licensed to PSF under a Contributor Agreement.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
__all__ = ['Queue', 'SimpleQueue', 'JoinableQueue']
|
|
11
|
+
|
|
12
|
+
import sys
|
|
13
|
+
import os
|
|
14
|
+
import threading
|
|
15
|
+
import collections
|
|
16
|
+
import time
|
|
17
|
+
import types
|
|
18
|
+
import weakref
|
|
19
|
+
import errno
|
|
20
|
+
|
|
21
|
+
from queue import Empty, Full
|
|
22
|
+
|
|
23
|
+
from . import connection
|
|
24
|
+
from . import context
|
|
25
|
+
_ForkingPickler = context.reduction.ForkingPickler
|
|
26
|
+
|
|
27
|
+
from .util import debug, info, Finalize, register_after_fork, is_exiting
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# Queue type using a pipe, buffer and thread
|
|
31
|
+
#
|
|
32
|
+
|
|
33
|
+
class Queue(object):
|
|
34
|
+
|
|
35
|
+
def __init__(self, maxsize=0, *, ctx):
|
|
36
|
+
if maxsize <= 0:
|
|
37
|
+
# Can raise ImportError (see issues #3770 and #23400)
|
|
38
|
+
from .synchronize import SEM_VALUE_MAX as maxsize
|
|
39
|
+
self._maxsize = maxsize
|
|
40
|
+
self._reader, self._writer = connection.Pipe(duplex=False)
|
|
41
|
+
self._rlock = ctx.Lock()
|
|
42
|
+
self._opid = os.getpid()
|
|
43
|
+
if sys.platform == 'win32':
|
|
44
|
+
self._wlock = None
|
|
45
|
+
else:
|
|
46
|
+
self._wlock = ctx.Lock()
|
|
47
|
+
self._sem = ctx.BoundedSemaphore(maxsize)
|
|
48
|
+
# For use by concurrent.futures
|
|
49
|
+
self._ignore_epipe = False
|
|
50
|
+
self._reset()
|
|
51
|
+
|
|
52
|
+
if sys.platform != 'win32':
|
|
53
|
+
register_after_fork(self, Queue._after_fork)
|
|
54
|
+
|
|
55
|
+
def __getstate__(self):
|
|
56
|
+
context.assert_spawning(self)
|
|
57
|
+
return (self._ignore_epipe, self._maxsize, self._reader, self._writer,
|
|
58
|
+
self._rlock, self._wlock, self._sem, self._opid)
|
|
59
|
+
|
|
60
|
+
def __setstate__(self, state):
|
|
61
|
+
(self._ignore_epipe, self._maxsize, self._reader, self._writer,
|
|
62
|
+
self._rlock, self._wlock, self._sem, self._opid) = state
|
|
63
|
+
self._reset()
|
|
64
|
+
|
|
65
|
+
def _after_fork(self):
|
|
66
|
+
debug('Queue._after_fork()')
|
|
67
|
+
self._reset(after_fork=True)
|
|
68
|
+
|
|
69
|
+
def _reset(self, after_fork=False):
|
|
70
|
+
if after_fork:
|
|
71
|
+
self._notempty._at_fork_reinit()
|
|
72
|
+
else:
|
|
73
|
+
self._notempty = threading.Condition(threading.Lock())
|
|
74
|
+
self._buffer = collections.deque()
|
|
75
|
+
self._thread = None
|
|
76
|
+
self._jointhread = None
|
|
77
|
+
self._joincancelled = False
|
|
78
|
+
self._closed = False
|
|
79
|
+
self._close = None
|
|
80
|
+
self._send_bytes = self._writer.send_bytes
|
|
81
|
+
self._recv_bytes = self._reader.recv_bytes
|
|
82
|
+
self._poll = self._reader.poll
|
|
83
|
+
|
|
84
|
+
def put(self, obj, block=True, timeout=None):
|
|
85
|
+
if self._closed:
|
|
86
|
+
raise ValueError(f"Queue {self!r} is closed")
|
|
87
|
+
if not self._sem.acquire(block, timeout):
|
|
88
|
+
raise Full
|
|
89
|
+
|
|
90
|
+
with self._notempty:
|
|
91
|
+
if self._thread is None:
|
|
92
|
+
self._start_thread()
|
|
93
|
+
self._buffer.append(obj)
|
|
94
|
+
self._notempty.notify()
|
|
95
|
+
|
|
96
|
+
def get(self, block=True, timeout=None):
|
|
97
|
+
if self._closed:
|
|
98
|
+
raise ValueError(f"Queue {self!r} is closed")
|
|
99
|
+
if block and timeout is None:
|
|
100
|
+
with self._rlock:
|
|
101
|
+
res = self._recv_bytes()
|
|
102
|
+
self._sem.release()
|
|
103
|
+
else:
|
|
104
|
+
if block:
|
|
105
|
+
deadline = time.monotonic() + timeout
|
|
106
|
+
if not self._rlock.acquire(block, timeout):
|
|
107
|
+
raise Empty
|
|
108
|
+
try:
|
|
109
|
+
if block:
|
|
110
|
+
timeout = deadline - time.monotonic()
|
|
111
|
+
if not self._poll(timeout):
|
|
112
|
+
raise Empty
|
|
113
|
+
elif not self._poll():
|
|
114
|
+
raise Empty
|
|
115
|
+
res = self._recv_bytes()
|
|
116
|
+
self._sem.release()
|
|
117
|
+
finally:
|
|
118
|
+
self._rlock.release()
|
|
119
|
+
# unserialize the data after having released the lock
|
|
120
|
+
return _ForkingPickler.loads(res)
|
|
121
|
+
|
|
122
|
+
def qsize(self):
|
|
123
|
+
# Raises NotImplementedError on Mac OSX because of broken sem_getvalue()
|
|
124
|
+
return self._maxsize - self._sem._semlock._get_value()
|
|
125
|
+
|
|
126
|
+
def empty(self):
|
|
127
|
+
return not self._poll()
|
|
128
|
+
|
|
129
|
+
def full(self):
|
|
130
|
+
return self._sem._semlock._is_zero()
|
|
131
|
+
|
|
132
|
+
def get_nowait(self):
|
|
133
|
+
return self.get(False)
|
|
134
|
+
|
|
135
|
+
def put_nowait(self, obj):
|
|
136
|
+
return self.put(obj, False)
|
|
137
|
+
|
|
138
|
+
def close(self):
|
|
139
|
+
self._closed = True
|
|
140
|
+
close = self._close
|
|
141
|
+
if close:
|
|
142
|
+
self._close = None
|
|
143
|
+
close()
|
|
144
|
+
|
|
145
|
+
def join_thread(self):
|
|
146
|
+
debug('Queue.join_thread()')
|
|
147
|
+
assert self._closed, "Queue {0!r} not closed".format(self)
|
|
148
|
+
if self._jointhread:
|
|
149
|
+
self._jointhread()
|
|
150
|
+
|
|
151
|
+
def cancel_join_thread(self):
|
|
152
|
+
debug('Queue.cancel_join_thread()')
|
|
153
|
+
self._joincancelled = True
|
|
154
|
+
try:
|
|
155
|
+
self._jointhread.cancel()
|
|
156
|
+
except AttributeError:
|
|
157
|
+
pass
|
|
158
|
+
|
|
159
|
+
def _terminate_broken(self):
|
|
160
|
+
# Close a Queue on error.
|
|
161
|
+
|
|
162
|
+
# gh-94777: Prevent queue writing to a pipe which is no longer read.
|
|
163
|
+
self._reader.close()
|
|
164
|
+
|
|
165
|
+
# gh-107219: Close the connection writer which can unblock
|
|
166
|
+
# Queue._feed() if it was stuck in send_bytes().
|
|
167
|
+
if sys.platform == 'win32':
|
|
168
|
+
self._writer.close()
|
|
169
|
+
|
|
170
|
+
self.close()
|
|
171
|
+
self.join_thread()
|
|
172
|
+
|
|
173
|
+
def _start_thread(self):
|
|
174
|
+
debug('Queue._start_thread()')
|
|
175
|
+
|
|
176
|
+
# Start thread which transfers data from buffer to pipe
|
|
177
|
+
self._buffer.clear()
|
|
178
|
+
self._thread = threading.Thread(
|
|
179
|
+
target=Queue._feed,
|
|
180
|
+
args=(self._buffer, self._notempty, self._send_bytes,
|
|
181
|
+
self._wlock, self._reader.close, self._writer.close,
|
|
182
|
+
self._ignore_epipe, self._on_queue_feeder_error,
|
|
183
|
+
self._sem),
|
|
184
|
+
name='QueueFeederThread',
|
|
185
|
+
daemon=True,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
try:
|
|
189
|
+
debug('doing self._thread.start()')
|
|
190
|
+
self._thread.start()
|
|
191
|
+
debug('... done self._thread.start()')
|
|
192
|
+
except:
|
|
193
|
+
# gh-109047: During Python finalization, creating a thread
|
|
194
|
+
# can fail with RuntimeError.
|
|
195
|
+
self._thread = None
|
|
196
|
+
raise
|
|
197
|
+
|
|
198
|
+
if not self._joincancelled:
|
|
199
|
+
self._jointhread = Finalize(
|
|
200
|
+
self._thread, Queue._finalize_join,
|
|
201
|
+
[weakref.ref(self._thread)],
|
|
202
|
+
exitpriority=-5
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
# Send sentinel to the thread queue object when garbage collected
|
|
206
|
+
self._close = Finalize(
|
|
207
|
+
self, Queue._finalize_close,
|
|
208
|
+
[self._buffer, self._notempty],
|
|
209
|
+
exitpriority=10
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
@staticmethod
|
|
213
|
+
def _finalize_join(twr):
|
|
214
|
+
debug('joining queue thread')
|
|
215
|
+
thread = twr()
|
|
216
|
+
if thread is not None:
|
|
217
|
+
thread.join()
|
|
218
|
+
debug('... queue thread joined')
|
|
219
|
+
else:
|
|
220
|
+
debug('... queue thread already dead')
|
|
221
|
+
|
|
222
|
+
@staticmethod
|
|
223
|
+
def _finalize_close(buffer, notempty):
|
|
224
|
+
debug('telling queue thread to quit')
|
|
225
|
+
with notempty:
|
|
226
|
+
buffer.append(_sentinel)
|
|
227
|
+
notempty.notify()
|
|
228
|
+
|
|
229
|
+
@staticmethod
|
|
230
|
+
def _feed(buffer, notempty, send_bytes, writelock, reader_close,
|
|
231
|
+
writer_close, ignore_epipe, onerror, queue_sem):
|
|
232
|
+
debug('starting thread to feed data to pipe')
|
|
233
|
+
nacquire = notempty.acquire
|
|
234
|
+
nrelease = notempty.release
|
|
235
|
+
nwait = notempty.wait
|
|
236
|
+
bpopleft = buffer.popleft
|
|
237
|
+
sentinel = _sentinel
|
|
238
|
+
if sys.platform != 'win32':
|
|
239
|
+
wacquire = writelock.acquire
|
|
240
|
+
wrelease = writelock.release
|
|
241
|
+
else:
|
|
242
|
+
wacquire = None
|
|
243
|
+
|
|
244
|
+
while 1:
|
|
245
|
+
try:
|
|
246
|
+
nacquire()
|
|
247
|
+
try:
|
|
248
|
+
if not buffer:
|
|
249
|
+
nwait()
|
|
250
|
+
finally:
|
|
251
|
+
nrelease()
|
|
252
|
+
try:
|
|
253
|
+
while 1:
|
|
254
|
+
obj = bpopleft()
|
|
255
|
+
if obj is sentinel:
|
|
256
|
+
debug('feeder thread got sentinel -- exiting')
|
|
257
|
+
reader_close()
|
|
258
|
+
writer_close()
|
|
259
|
+
return
|
|
260
|
+
|
|
261
|
+
# serialize the data before acquiring the lock
|
|
262
|
+
obj = _ForkingPickler.dumps(obj)
|
|
263
|
+
if wacquire is None:
|
|
264
|
+
send_bytes(obj)
|
|
265
|
+
else:
|
|
266
|
+
wacquire()
|
|
267
|
+
try:
|
|
268
|
+
send_bytes(obj)
|
|
269
|
+
finally:
|
|
270
|
+
wrelease()
|
|
271
|
+
except IndexError:
|
|
272
|
+
pass
|
|
273
|
+
except Exception as e:
|
|
274
|
+
if ignore_epipe and getattr(e, 'errno', 0) == errno.EPIPE:
|
|
275
|
+
return
|
|
276
|
+
# Since this runs in a daemon thread the resources it uses
|
|
277
|
+
# may be become unusable while the process is cleaning up.
|
|
278
|
+
# We ignore errors which happen after the process has
|
|
279
|
+
# started to cleanup.
|
|
280
|
+
if is_exiting():
|
|
281
|
+
info('error in queue thread: %s', e)
|
|
282
|
+
return
|
|
283
|
+
else:
|
|
284
|
+
# Since the object has not been sent in the queue, we need
|
|
285
|
+
# to decrease the size of the queue. The error acts as
|
|
286
|
+
# if the object had been silently removed from the queue
|
|
287
|
+
# and this step is necessary to have a properly working
|
|
288
|
+
# queue.
|
|
289
|
+
queue_sem.release()
|
|
290
|
+
onerror(e, obj)
|
|
291
|
+
|
|
292
|
+
@staticmethod
|
|
293
|
+
def _on_queue_feeder_error(e, obj):
|
|
294
|
+
"""
|
|
295
|
+
Private API hook called when feeding data in the background thread
|
|
296
|
+
raises an exception. For overriding by concurrent.futures.
|
|
297
|
+
"""
|
|
298
|
+
import traceback
|
|
299
|
+
traceback.print_exc()
|
|
300
|
+
|
|
301
|
+
__class_getitem__ = classmethod(types.GenericAlias)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
_sentinel = object()
|
|
305
|
+
|
|
306
|
+
#
|
|
307
|
+
# A queue type which also supports join() and task_done() methods
|
|
308
|
+
#
|
|
309
|
+
# Note that if you do not call task_done() for each finished task then
|
|
310
|
+
# eventually the counter's semaphore may overflow causing Bad Things
|
|
311
|
+
# to happen.
|
|
312
|
+
#
|
|
313
|
+
|
|
314
|
+
class JoinableQueue(Queue):
|
|
315
|
+
|
|
316
|
+
def __init__(self, maxsize=0, *, ctx):
|
|
317
|
+
Queue.__init__(self, maxsize, ctx=ctx)
|
|
318
|
+
self._unfinished_tasks = ctx.Semaphore(0)
|
|
319
|
+
self._cond = ctx.Condition()
|
|
320
|
+
|
|
321
|
+
def __getstate__(self):
|
|
322
|
+
return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks)
|
|
323
|
+
|
|
324
|
+
def __setstate__(self, state):
|
|
325
|
+
Queue.__setstate__(self, state[:-2])
|
|
326
|
+
self._cond, self._unfinished_tasks = state[-2:]
|
|
327
|
+
|
|
328
|
+
def put(self, obj, block=True, timeout=None):
|
|
329
|
+
if self._closed:
|
|
330
|
+
raise ValueError(f"Queue {self!r} is closed")
|
|
331
|
+
if not self._sem.acquire(block, timeout):
|
|
332
|
+
raise Full
|
|
333
|
+
|
|
334
|
+
with self._notempty, self._cond:
|
|
335
|
+
if self._thread is None:
|
|
336
|
+
self._start_thread()
|
|
337
|
+
self._buffer.append(obj)
|
|
338
|
+
self._unfinished_tasks.release()
|
|
339
|
+
self._notempty.notify()
|
|
340
|
+
|
|
341
|
+
def task_done(self):
|
|
342
|
+
with self._cond:
|
|
343
|
+
if not self._unfinished_tasks.acquire(False):
|
|
344
|
+
raise ValueError('task_done() called too many times')
|
|
345
|
+
if self._unfinished_tasks._semlock._is_zero():
|
|
346
|
+
self._cond.notify_all()
|
|
347
|
+
|
|
348
|
+
def join(self):
|
|
349
|
+
with self._cond:
|
|
350
|
+
if not self._unfinished_tasks._semlock._is_zero():
|
|
351
|
+
self._cond.wait()
|
|
352
|
+
|
|
353
|
+
#
|
|
354
|
+
# Simplified Queue type -- really just a locked pipe
|
|
355
|
+
#
|
|
356
|
+
|
|
357
|
+
class SimpleQueue(object):
|
|
358
|
+
|
|
359
|
+
def __init__(self, *, ctx):
|
|
360
|
+
self._reader, self._writer = connection.Pipe(duplex=False)
|
|
361
|
+
self._rlock = ctx.Lock()
|
|
362
|
+
self._poll = self._reader.poll
|
|
363
|
+
if sys.platform == 'win32':
|
|
364
|
+
self._wlock = None
|
|
365
|
+
else:
|
|
366
|
+
self._wlock = ctx.Lock()
|
|
367
|
+
|
|
368
|
+
def close(self):
|
|
369
|
+
self._reader.close()
|
|
370
|
+
self._writer.close()
|
|
371
|
+
|
|
372
|
+
def empty(self):
|
|
373
|
+
return not self._poll()
|
|
374
|
+
|
|
375
|
+
def __getstate__(self):
|
|
376
|
+
context.assert_spawning(self)
|
|
377
|
+
return (self._reader, self._writer, self._rlock, self._wlock)
|
|
378
|
+
|
|
379
|
+
def __setstate__(self, state):
|
|
380
|
+
(self._reader, self._writer, self._rlock, self._wlock) = state
|
|
381
|
+
self._poll = self._reader.poll
|
|
382
|
+
|
|
383
|
+
def get(self):
|
|
384
|
+
with self._rlock:
|
|
385
|
+
res = self._reader.recv_bytes()
|
|
386
|
+
# unserialize the data after having released the lock
|
|
387
|
+
return _ForkingPickler.loads(res)
|
|
388
|
+
|
|
389
|
+
def put(self, obj):
|
|
390
|
+
# serialize the data before acquiring the lock
|
|
391
|
+
obj = _ForkingPickler.dumps(obj)
|
|
392
|
+
if self._wlock is None:
|
|
393
|
+
# writes to a message oriented win32 pipe are atomic
|
|
394
|
+
self._writer.send_bytes(obj)
|
|
395
|
+
else:
|
|
396
|
+
with self._wlock:
|
|
397
|
+
self._writer.send_bytes(obj)
|
|
398
|
+
|
|
399
|
+
__class_getitem__ = classmethod(types.GenericAlias)
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Module which deals with pickling of objects.
|
|
3
|
+
#
|
|
4
|
+
# multiprocessing/reduction.py
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006-2008, R Oudkerk
|
|
7
|
+
# Licensed to PSF under a Contributor Agreement.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
from abc import ABCMeta
|
|
11
|
+
import copyreg
|
|
12
|
+
import functools
|
|
13
|
+
import io
|
|
14
|
+
import os
|
|
15
|
+
import pickle
|
|
16
|
+
import socket
|
|
17
|
+
import sys
|
|
18
|
+
|
|
19
|
+
from . import context
|
|
20
|
+
|
|
21
|
+
__all__ = ['send_handle', 'recv_handle', 'ForkingPickler', 'register', 'dump']
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
HAVE_SEND_HANDLE = (sys.platform == 'win32' or
|
|
25
|
+
(hasattr(socket, 'CMSG_LEN') and
|
|
26
|
+
hasattr(socket, 'SCM_RIGHTS') and
|
|
27
|
+
hasattr(socket.socket, 'sendmsg')))
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# Pickler subclass
|
|
31
|
+
#
|
|
32
|
+
|
|
33
|
+
class ForkingPickler(pickle.Pickler):
|
|
34
|
+
'''Pickler subclass used by multiprocessing.'''
|
|
35
|
+
_extra_reducers = {}
|
|
36
|
+
_copyreg_dispatch_table = copyreg.dispatch_table
|
|
37
|
+
|
|
38
|
+
def __init__(self, *args):
|
|
39
|
+
super().__init__(*args)
|
|
40
|
+
self.dispatch_table = self._copyreg_dispatch_table.copy()
|
|
41
|
+
self.dispatch_table.update(self._extra_reducers)
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def register(cls, type, reduce):
|
|
45
|
+
'''Register a reduce function for a type.'''
|
|
46
|
+
cls._extra_reducers[type] = reduce
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def dumps(cls, obj, protocol=None):
|
|
50
|
+
buf = io.BytesIO()
|
|
51
|
+
cls(buf, protocol).dump(obj)
|
|
52
|
+
return buf.getbuffer()
|
|
53
|
+
|
|
54
|
+
loads = pickle.loads
|
|
55
|
+
|
|
56
|
+
register = ForkingPickler.register
|
|
57
|
+
|
|
58
|
+
def dump(obj, file, protocol=None):
|
|
59
|
+
'''Replacement for pickle.dump() using ForkingPickler.'''
|
|
60
|
+
ForkingPickler(file, protocol).dump(obj)
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# Platform specific definitions
|
|
64
|
+
#
|
|
65
|
+
|
|
66
|
+
if sys.platform == 'win32':
|
|
67
|
+
# Windows
|
|
68
|
+
__all__ += ['DupHandle', 'duplicate', 'steal_handle']
|
|
69
|
+
import _winapi
|
|
70
|
+
|
|
71
|
+
def duplicate(handle, target_process=None, inheritable=False,
|
|
72
|
+
*, source_process=None):
|
|
73
|
+
'''Duplicate a handle. (target_process is a handle not a pid!)'''
|
|
74
|
+
current_process = _winapi.GetCurrentProcess()
|
|
75
|
+
if source_process is None:
|
|
76
|
+
source_process = current_process
|
|
77
|
+
if target_process is None:
|
|
78
|
+
target_process = current_process
|
|
79
|
+
return _winapi.DuplicateHandle(
|
|
80
|
+
source_process, handle, target_process,
|
|
81
|
+
0, inheritable, _winapi.DUPLICATE_SAME_ACCESS)
|
|
82
|
+
|
|
83
|
+
def steal_handle(source_pid, handle):
|
|
84
|
+
'''Steal a handle from process identified by source_pid.'''
|
|
85
|
+
source_process_handle = _winapi.OpenProcess(
|
|
86
|
+
_winapi.PROCESS_DUP_HANDLE, False, source_pid)
|
|
87
|
+
try:
|
|
88
|
+
return _winapi.DuplicateHandle(
|
|
89
|
+
source_process_handle, handle,
|
|
90
|
+
_winapi.GetCurrentProcess(), 0, False,
|
|
91
|
+
_winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE)
|
|
92
|
+
finally:
|
|
93
|
+
_winapi.CloseHandle(source_process_handle)
|
|
94
|
+
|
|
95
|
+
def send_handle(conn, handle, destination_pid):
|
|
96
|
+
'''Send a handle over a local connection.'''
|
|
97
|
+
dh = DupHandle(handle, _winapi.DUPLICATE_SAME_ACCESS, destination_pid)
|
|
98
|
+
conn.send(dh)
|
|
99
|
+
|
|
100
|
+
def recv_handle(conn):
|
|
101
|
+
'''Receive a handle over a local connection.'''
|
|
102
|
+
return conn.recv().detach()
|
|
103
|
+
|
|
104
|
+
class DupHandle(object):
|
|
105
|
+
'''Picklable wrapper for a handle.'''
|
|
106
|
+
def __init__(self, handle, access, pid=None):
|
|
107
|
+
if pid is None:
|
|
108
|
+
# We just duplicate the handle in the current process and
|
|
109
|
+
# let the receiving process steal the handle.
|
|
110
|
+
pid = os.getpid()
|
|
111
|
+
proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, pid)
|
|
112
|
+
try:
|
|
113
|
+
self._handle = _winapi.DuplicateHandle(
|
|
114
|
+
_winapi.GetCurrentProcess(),
|
|
115
|
+
handle, proc, access, False, 0)
|
|
116
|
+
finally:
|
|
117
|
+
_winapi.CloseHandle(proc)
|
|
118
|
+
self._access = access
|
|
119
|
+
self._pid = pid
|
|
120
|
+
|
|
121
|
+
def detach(self):
|
|
122
|
+
'''Get the handle. This should only be called once.'''
|
|
123
|
+
# retrieve handle from process which currently owns it
|
|
124
|
+
if self._pid == os.getpid():
|
|
125
|
+
# The handle has already been duplicated for this process.
|
|
126
|
+
return self._handle
|
|
127
|
+
# We must steal the handle from the process whose pid is self._pid.
|
|
128
|
+
proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False,
|
|
129
|
+
self._pid)
|
|
130
|
+
try:
|
|
131
|
+
return _winapi.DuplicateHandle(
|
|
132
|
+
proc, self._handle, _winapi.GetCurrentProcess(),
|
|
133
|
+
self._access, False, _winapi.DUPLICATE_CLOSE_SOURCE)
|
|
134
|
+
finally:
|
|
135
|
+
_winapi.CloseHandle(proc)
|
|
136
|
+
|
|
137
|
+
else:
|
|
138
|
+
# Unix
|
|
139
|
+
__all__ += ['DupFd', 'sendfds', 'recvfds']
|
|
140
|
+
import array
|
|
141
|
+
|
|
142
|
+
# On MacOSX we should acknowledge receipt of fds -- see Issue14669
|
|
143
|
+
ACKNOWLEDGE = sys.platform == 'darwin'
|
|
144
|
+
|
|
145
|
+
def sendfds(sock, fds):
|
|
146
|
+
'''Send an array of fds over an AF_UNIX socket.'''
|
|
147
|
+
fds = array.array('i', fds)
|
|
148
|
+
msg = bytes([len(fds) % 256])
|
|
149
|
+
sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)])
|
|
150
|
+
if ACKNOWLEDGE and sock.recv(1) != b'A':
|
|
151
|
+
raise RuntimeError('did not receive acknowledgement of fd')
|
|
152
|
+
|
|
153
|
+
def recvfds(sock, size):
|
|
154
|
+
'''Receive an array of fds over an AF_UNIX socket.'''
|
|
155
|
+
a = array.array('i')
|
|
156
|
+
bytes_size = a.itemsize * size
|
|
157
|
+
msg, ancdata, flags, addr = sock.recvmsg(1, socket.CMSG_SPACE(bytes_size))
|
|
158
|
+
if not msg and not ancdata:
|
|
159
|
+
raise EOFError
|
|
160
|
+
try:
|
|
161
|
+
if ACKNOWLEDGE:
|
|
162
|
+
sock.send(b'A')
|
|
163
|
+
if len(ancdata) != 1:
|
|
164
|
+
raise RuntimeError('received %d items of ancdata' %
|
|
165
|
+
len(ancdata))
|
|
166
|
+
cmsg_level, cmsg_type, cmsg_data = ancdata[0]
|
|
167
|
+
if (cmsg_level == socket.SOL_SOCKET and
|
|
168
|
+
cmsg_type == socket.SCM_RIGHTS):
|
|
169
|
+
if len(cmsg_data) % a.itemsize != 0:
|
|
170
|
+
raise ValueError
|
|
171
|
+
a.frombytes(cmsg_data)
|
|
172
|
+
if len(a) % 256 != msg[0]:
|
|
173
|
+
raise AssertionError(
|
|
174
|
+
"Len is {0:n} but msg[0] is {1!r}".format(
|
|
175
|
+
len(a), msg[0]))
|
|
176
|
+
return list(a)
|
|
177
|
+
except (ValueError, IndexError):
|
|
178
|
+
pass
|
|
179
|
+
raise RuntimeError('Invalid data received')
|
|
180
|
+
|
|
181
|
+
def send_handle(conn, handle, destination_pid):
|
|
182
|
+
'''Send a handle over a local connection.'''
|
|
183
|
+
with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s:
|
|
184
|
+
sendfds(s, [handle])
|
|
185
|
+
|
|
186
|
+
def recv_handle(conn):
|
|
187
|
+
'''Receive a handle over a local connection.'''
|
|
188
|
+
with socket.fromfd(conn.fileno(), socket.AF_UNIX, socket.SOCK_STREAM) as s:
|
|
189
|
+
return recvfds(s, 1)[0]
|
|
190
|
+
|
|
191
|
+
def DupFd(fd):
|
|
192
|
+
'''Return a wrapper for an fd.'''
|
|
193
|
+
popen_obj = context.get_spawning_popen()
|
|
194
|
+
if popen_obj is not None:
|
|
195
|
+
return popen_obj.DupFd(popen_obj.duplicate_for_child(fd))
|
|
196
|
+
elif HAVE_SEND_HANDLE:
|
|
197
|
+
from . import resource_sharer
|
|
198
|
+
return resource_sharer.DupFd(fd)
|
|
199
|
+
else:
|
|
200
|
+
raise ValueError('SCM_RIGHTS appears not to be available')
|
|
201
|
+
|
|
202
|
+
#
|
|
203
|
+
# Try making some callable types picklable
|
|
204
|
+
#
|
|
205
|
+
|
|
206
|
+
def _reduce_method(m):
|
|
207
|
+
if m.__self__ is None:
|
|
208
|
+
return getattr, (m.__class__, m.__func__.__name__)
|
|
209
|
+
else:
|
|
210
|
+
return getattr, (m.__self__, m.__func__.__name__)
|
|
211
|
+
class _C:
|
|
212
|
+
def f(self):
|
|
213
|
+
pass
|
|
214
|
+
register(type(_C().f), _reduce_method)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _reduce_method_descriptor(m):
|
|
218
|
+
return getattr, (m.__objclass__, m.__name__)
|
|
219
|
+
register(type(list.append), _reduce_method_descriptor)
|
|
220
|
+
register(type(int.__add__), _reduce_method_descriptor)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def _reduce_partial(p):
|
|
224
|
+
return _rebuild_partial, (p.func, p.args, p.keywords or {})
|
|
225
|
+
def _rebuild_partial(func, args, keywords):
|
|
226
|
+
return functools.partial(func, *args, **keywords)
|
|
227
|
+
register(functools.partial, _reduce_partial)
|
|
228
|
+
|
|
229
|
+
#
|
|
230
|
+
# Make sockets picklable
|
|
231
|
+
#
|
|
232
|
+
|
|
233
|
+
if sys.platform == 'win32':
|
|
234
|
+
def _reduce_socket(s):
|
|
235
|
+
from .resource_sharer import DupSocket
|
|
236
|
+
return _rebuild_socket, (DupSocket(s),)
|
|
237
|
+
def _rebuild_socket(ds):
|
|
238
|
+
return ds.detach()
|
|
239
|
+
register(socket.socket, _reduce_socket)
|
|
240
|
+
|
|
241
|
+
else:
|
|
242
|
+
def _reduce_socket(s):
|
|
243
|
+
df = DupFd(s.fileno())
|
|
244
|
+
return _rebuild_socket, (df, s.family, s.type, s.proto)
|
|
245
|
+
def _rebuild_socket(df, family, type, proto):
|
|
246
|
+
fd = df.detach()
|
|
247
|
+
return socket.socket(family, type, proto, fileno=fd)
|
|
248
|
+
register(socket.socket, _reduce_socket)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class AbstractReducer(metaclass=ABCMeta):
|
|
252
|
+
'''Abstract base class for use in implementing a Reduction class
|
|
253
|
+
suitable for use in replacing the standard reduction mechanism
|
|
254
|
+
used in multiprocessing.'''
|
|
255
|
+
ForkingPickler = ForkingPickler
|
|
256
|
+
register = register
|
|
257
|
+
dump = dump
|
|
258
|
+
send_handle = send_handle
|
|
259
|
+
recv_handle = recv_handle
|
|
260
|
+
|
|
261
|
+
if sys.platform == 'win32':
|
|
262
|
+
steal_handle = steal_handle
|
|
263
|
+
duplicate = duplicate
|
|
264
|
+
DupHandle = DupHandle
|
|
265
|
+
else:
|
|
266
|
+
sendfds = sendfds
|
|
267
|
+
recvfds = recvfds
|
|
268
|
+
DupFd = DupFd
|
|
269
|
+
|
|
270
|
+
_reduce_method = _reduce_method
|
|
271
|
+
_reduce_method_descriptor = _reduce_method_descriptor
|
|
272
|
+
_rebuild_partial = _rebuild_partial
|
|
273
|
+
_reduce_socket = _reduce_socket
|
|
274
|
+
_rebuild_socket = _rebuild_socket
|
|
275
|
+
|
|
276
|
+
def __init__(self, *args):
|
|
277
|
+
register(type(_C().f), _reduce_method)
|
|
278
|
+
register(type(list.append), _reduce_method_descriptor)
|
|
279
|
+
register(type(int.__add__), _reduce_method_descriptor)
|
|
280
|
+
register(functools.partial, _reduce_partial)
|
|
281
|
+
register(socket.socket, _reduce_socket)
|