Ответ 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.