Вы можете использовать join
вместо слияния.
код SCALA
val newDF = df1
.join(df2, Seq("source", "destination"), "left_outer")
код PYTHON
newDF = df1
.join(df2, ['source', 'destination'], 'left_outer')
Вы могли действительно использовать мониторы, семафоры, или Вы могли даже вращаться, ожидают, пока Ваш асинхронный вызов (вызовы) метода не сделан.
Но можно получить это бесплатно также. Если Вы звоните EndInvoke()
на делегате, который был ранее запущен с BeginInvoke()
, Вы блокируетесь, пока асинхронная работа не сделана.
Не уверенный, если это помогает, потому что необходимо использовать этот асинхронный шаблон. Если это делает, Вы получаете Асинхронное выполнение (и преобразование от Асинхронной спины до синхронных вызовов) бесплатно.
Выезд Называя Синхронные Методы Асинхронно на MSDN для большего количества информации об этом шаблоне.
Я надеюсь, что это помогает!
Это звучит мне как Вы, хотят очередь..., если существует происходящий запрос, добавьте к очереди (с a Monitor
); когда вызов завершится, проверьте очередь...
IAsyncResult
имеет свойство AsyncWaitHandle
который дает Вам дескриптор ожидания (если Вы доступны), который будет сообщен, когда операция завершится.
Таким образом можно использовать WaitHandle.WaitAll
(или .WaitAny
) выполнить невращение ожидает на многих дескрипторах сразу.
У Вас есть несколько опций. Вот несколько идей -
Прежде всего Вы могли использовать ManualResetEvent, чтобы "заблокировать" основной поток до Ваших асинхронных операций, которые все завершают. Идея состоит в том, чтобы просто иметь основной вызов потока, Вы функционируете, затем делаете событие. WaitOne (), и функция ответственен за установку события.
С другой стороны, Вы могли попытаться использовать что-то как Семафор. Это разработано для помощи в этих ситуациях, так как можно ограничить его 10 одновременными происшествиями, не волнуясь о попытке обработать его сами. Это, вероятно, было бы моим предпочтительным подходом.
Существует две причины использования потоков:
Недостаток использования потоков:
Если узкое место является 3-минутным ожиданием на удаленной машине, может стоить отметить, что несколько потоков не собираются получать Вас любое преимущество производительности. Вы могли записать целой вещи однопоточный, поддерживающий ряд до десяти объектов "конечного автомата" и перемещения их через этапы пользовательского создания, всех от одного потока, с небольшим различием в по всей производительности.
Таким образом, то, что Вы, возможно, ищете, является хорошим читаемым размещением кода путем превращения пользовательской операции создания в последовательность вызовов, которые читают как отдельный метод (которым они были бы то, если бы Вы выполнили их как поток).
Другой способ добраться, который является с помощью метода итератора, т.е. содержащий yield return
операторы, который также дает Вам преимущества удобочитаемости отдельного метода. Я, должно быть, связался с этим три раза на прошлой неделе! Это - статья Jeffrey Richter о AsyncEnumerator.
Я немного неясен о том, как Вы используете TransactionScope (таким образом, я могу быть от основы), но можно создать DependentTransactions, который может быть скупо выдан к рабочим потокам. Ваша транзакция верхнего уровня не будет фиксировать, пока все DependentTransactions успешно не фиксировали и наоборот с откатом. Я нашел это как простой способ сделать все или ничего через потоки пока операция, которую Вы вызываете, инкапсулирует функциональность фиксации/отката (IEnlistmentNotification и т.п.).