Python Multiprocess Queue limit 32767 - PullRequest
0 голосов
/ 04 ноября 2019

Мне нужно увеличить размер очереди с 32767 до, вероятно, ближе к 200 000 для количества элементов, над которыми мне нужно работать. Мой код довольно прост и загружается в фазе очереди и использует фазу очереди. Я действительно не хочу менять код, чтобы справиться с этим ограничением, и данные в очереди также довольно просты.

Я работаю на OSX 10.14.x. Я сделал все известные изменения для операций с базой данных и увеличил каждую опцию семафора.

Я вижу, что 32768 - это 32-битное ограничение. Мой питон - 64-битная версия 3.7.5.

Что я хочу знать, так это то, является ли это ограничением для библиотеки или ограничением ОС. Или настраиваемый параметр.

Ни один из ответов не был ясен по этому вопросу. Использование queue.Queue в той же системе не имеет ограничения, которое кажется немного странным.

Вопрос:

  1. Это ограничение библиотеки?
  2. Является ли это ограничение, которое может быть изменено / повышено с помощью какого-либо магического параметра в ядре.

ulimit = unlimited

kernal: Darwin XXXXXXXXXX 18.7.0 Darwin Kernel Версия 18.7.0:Вт 20 августа 16:57:14 ФДТ 2019;root: xnu-4903.271.2 ~ 2 / RELEASE_X86_64 x86_64

16 ГБ ОЗУ и 6 ядер.

/etc/sysctl.conf
kern.sysv.semmni=87381
kern.sysv.semmnu=87381
kern.sysv.semume=10
kernel.shmall=2097152
kernel.sys.shmmax=2147483648
kernel.sys.shmmni=4096
kern.maxfiles=165535
kern.maxfilesperproc=165535
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65000
kern.corefile=core
kern.maxproc=2068
kern.maxprocperuid=2068
kern.posix.sem.max=164000
kern.sysv.semume=100
kern.posix.sem.max: 84000
security.mac.posixsem_enforce=0

Я пытаюсь заставить работать мое приложение.

Iпопытался изменить все стандартные ограничения Unix. Я прочитал много исходного кода в библиотеке и много поисков Google на семафорах ctx.

Я тестировал на Ubuntu 18.04, и он работает. Похоже, что это связано с OSX 10.14.x

Python 3.7.5 (default, Oct 19 2019, 01:20:12)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'python'
>>> from multiprocessing import Queue
>>> myQ = Queue (32767)
>>> myOtherQ = Queue (100000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/context.py", line 102, in Queue
    return Queue(maxsize, ctx=self.get_context())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/queues.py", line 48, in __init__
    self._sem = ctx.BoundedSemaphore(maxsize)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/context.py", line 87, in BoundedSemaphore
    return BoundedSemaphore(value, ctx=self.get_context())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/synchronize.py", line 145, in __init__
    SemLock.__init__(self, SEMAPHORE, value, value, ctx=ctx)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/multiprocessing/synchronize.py", line 59, in __init__
    unlink_now)
OSError: [Errno 22] Invalid argument
Using Alternate queue.Queue
bash-3.2# python3
Python 3.7.5 (default, Oct 19 2019, 01:20:12)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from queue import Queue
>>> myQ = Queue(100000)

Так что немного больше исследований, и я сузил вопрос об изменении значения ядра: kern.sysv.semvmx. Однако в OSX это не является допустимым параметром.

ipcs -S
IPC status from <running system> as of Mon Nov  4 21:59:10 PST 2019
seminfo:
    semmap:     30  (# of entries in semaphore map)
    semmni:     24  (# of semaphore identifiers)
    semmns:     64  (# of semaphores in system)
    semmnu:     32  (# of undo structures in system)
    semmsl:  87381  (max # of semaphores per id)
    semopm:      5  (max # of operations per semop call)
    semume:     10  (max # of undo entries per process)
    semusz:     32  (size in bytes of undo structure)
    **semvmx:  32767    (semaphore maximum value)**
    semaem:  16384  (adjust on exit max value)

...