Подтвердить что ты не робот

Parallelism в Джулии. Особенности и ограничения

В своей статье arXiv оригинальные авторы Джулии упоминают следующее:

2.14 Parallelism. Параллельное выполнение обеспечивается системой обработки сообщений на основе сообщений, реализованной в Джулии в стандартной библиотеке. Дизайн языка поддерживает реализацию таких библиотек обеспечивая симметричные сопрограммы, которые также можно рассматривать как Совместно запланированные потоки. Эта функция позволяет асинхронно чтобы скрывать внутри библиотек, а не требовать чтобы настроить обратные вызовы. В настоящее время Юлия не поддерживает родной потоки, что является ограничением, но имеет то преимущество, что сложности синхронного использования разделяемой памяти.

Что они подразумевают, говоря, что Julia не поддерживает собственные потоки? Что такое собственный поток?

Поддерживают ли другие интерпретируемые языки, такие как Python или R этот тип parallelism? Только Джулия в этом?

4b9b3361

Ответ 1

"Собственные потоки" - это отдельные контексты выполнения, управляемые ядром операционной системы, доступ к пространству разделяемой памяти и возможность одновременного выполнения на отдельных ядрах. Сравните это с отдельными процессами, которые могут выполняться одновременно на нескольких ядрах, но имеют отдельные пространства памяти. Убедиться, что процессы взаимодействуют красиво, легко, поскольку они могут общаться только друг с другом через ядро. Обеспечение того, чтобы потоки не взаимодействовали в непредсказуемых, ошибочных способах, очень сложно, так как они могут беспрепятственно читать и записывать в одну и ту же память.

Ситуация R довольно проста: R не многопоточно. Python немного сложнее: Python поддерживает потоки, но из-за глобальной блокировки интерпретатора (GIL) фактическое одновременное выполнение кода Python возможно. Другие популярные динамические языки с открытым исходным кодом находятся в разных смешанных состояниях относительно собственной потоковой передачи (Ruby: no/kinda/yes?; Node.js: no), но в целом ответ отрицательный, они не поддерживают полностью параллельную собственную поточную передачу, поэтому Джулия не одинока в этом.

Когда мы добавим shared-memory parallelism в Julia, как мы планируем - будь то собственные потоки или несколько процессов с общим памяти - это будет правда concurrency, и GIL не будет предотвращать одновременное выполнение кода Julia. Тем не менее, это невероятно сложная функция для добавления к языку, о чем свидетельствует несуществующая или ограниченная поддержка на других очень популярных, зрелых динамических языках. Добавление модели с общей памятью concurrency является технически сложным, но реальной проблемой является разработка модели программирования, которая позволит программистам эффективно использовать аппаратное обеспечение concurrency продуктивным и безопасным способом. Эта проблема, как правило, не решена и является очень активной областью исследований и экспериментов - нет "золотого стандарта" для копирования. Мы могли бы просто добавить поддержку потоков POSIX, но эта модель программирования считается опасной и невероятно трудной в использовании правильно и эффективно. Go имеет отличную историю concurrency, но предназначен для написания высококонкурентных серверов, а не для одновременной работы с большими данными, поэтому совершенно не ясно, что просто копирование модели Go - хорошая идея для Julia.