Я ищу дополнительные сведения о реализациях очередей в Python, чем я могу найти в документации.
Из того, что я понял, и извините мое невежество, если я ошибаюсь в этом:
queue.Queue()
: реализуется с помощью базовых массивов в памяти и поэтому не может использоваться совместно несколькими процессами, но может использоваться совместно между потоками. Пока что так хорошо.
multiprocessing.Queue()
: реализуется через трубы (man 2 pipes
), которые имеют ограничение по размеру (довольно крошечное: в Linux, man 7 pipe
говорит 65536 невербально):
Начиная с Linux 2.6.35, емкость по умолчанию составляет 65536 байт, но емкость может быть запрошена и задана с помощью операций
fcntl(2)
F_GETPIPE_SZ
иF_SETPIPE_SZ
Но, в Python, всякий раз, когда я пытаюсь записать в канал данные размером более 65536 байтов, он работает без исключения - я мог бы наводнить мою память следующим образом:
import multiprocessing
from time import sleep
def big():
result = ""
for i in range(1,70000):
result += ","+str(i)
return result # 408888 bytes string
def writequeue(q):
while True:
q.put(big())
sleep(0.1)
if __name__ == '__main__':
q = multiprocessing.Queue()
p = multiprocessing.Process(target=writequeue, args=(q,))
p.start()
while True:
sleep(1) # No pipe consumption, we just want to flood the pipe
Итак, вот мои вопросы:
-
Python настраивает ограничение на канал? если да, то насколько? Исходный код Python приветствуется.
-
Связываются ли Python сообщения, взаимодействующие с другими процессами, отличными от Python? Если да, приветствуются рабочие примеры (желательно JS) и ссылки ресурсов.