Мне нужно увеличить размер очереди с 32767 до, вероятно, ближе к 200 000 для количества элементов, над которыми мне нужно работать. Мой код довольно прост и загружается в фазе очереди и использует фазу очереди. Я действительно не хочу менять код, чтобы справиться с этим ограничением, и данные в очереди также довольно просты.
Я работаю на OSX 10.14.x. Я сделал все известные изменения для операций с базой данных и увеличил каждую опцию семафора.
Я вижу, что 32768 - это 32-битное ограничение. Мой питон - 64-битная версия 3.7.5.
Что я хочу знать, так это то, является ли это ограничением для библиотеки или ограничением ОС. Или настраиваемый параметр.
Ни один из ответов не был ясен по этому вопросу. Использование queue.Queue в той же системе не имеет ограничения, которое кажется немного странным.
Вопрос:
- Это ограничение библиотеки?
- Является ли это ограничение, которое может быть изменено / повышено с помощью какого-либо магического параметра в ядре.
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)