Юлия: понимание, когда происходит переключение задач

Я не смог найти подробную документацию по макросу @async. Из документов о параллелизме я понимаю, что внутри процесса Julia используется только один системный поток, и с помощью yieldto - поправьте меня, если я ошибаюсь.

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

Как я понимаю, yieldto где-то в коде (или в некоторой функции, вызываемой кодом) должно быть там, чтобы гарантировать, что система не привязана только к одной задаче.

Например, когда есть операция read, внутри чтения, вероятно, есть wait и в реализации wait, вероятно, есть yieldto вызов. Я думал, что без вызова yieldto код застрянет в одной задаче; однако выполнение следующего примера, кажется, подтверждает эту гипотезу неверной.

@async begin # Task A
    while true
        println("A")
    end    
end

while true # Task B
  println("B")
end

Этот код выдает следующий вывод

BA
BA
BA
...

Мне очень непонятно, где переключение задач происходит внутри задачи, созданной макросом @async в приведенном выше коде.

Как я могу рассказать о том, как в каком-то коде происходит переключение задач?

7 голосов | спросил Kalevi 27 J000000Sunday14 2014, 04:00:52

1 ответ


0

Переключение задач происходит внутри вызова println("A"), который в какой-то момент вызывает write(STDOUT, "A".data). Поскольку isa(STDOUT, Base.AsyncStream) и нет более специализированного метода, он разрешается следующим образом:

write{T}(s::AsyncStream,a::Array{T}) at stream.jl:782

Если вы посмотрите на этот метод, вы заметите, что он вызывает stream_wait(ct) для текущей задачи ct, что, в свою очередь, вызывает wait().

(Также обратите внимание, что println не является атомарным, поскольку есть потенциал wait между написанием аргументов и новой строкой.)

Конечно, вы можете определить, когда подобные вещи происходят, посмотрев весь соответствующий код. Но я не понимаю, почему вам нужно было бы это точно знать, потому что при работе с параллелизмом вы не должны зависеть от процессов не , переключающих контекст в любом случае. Если вы зависите от определенного порядка выполнения, выполните синхронизацию явно.

(Вы уже отметили это в своем вопросе, но позвольте мне повторить это здесь: как правило, при использовании зеленых потоков вы можете ожидать потенциальных переключений контекста при выполнении ввода-вывода, поскольку блокировка для ввода-вывода является примером из учебника почему зеленые нити полезны в первую очередь.)

ответил user4235730 18 22014vEurope/Moscow11bEurope/MoscowTue, 18 Nov 2014 19:48:08 +0300 2014, 19:48:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132