Я бы порекомендовал использовать пример, изложенный в репозитории github 14. НЛП-с-отправка . Код в учебнике, на который вы ссылаетесь, довольно прост, поэтому его можно сжать в один файл. Он предназначен только для того, чтобы показать, как можно использовать маршрутизацию для нескольких моделей LUIS и / или QnA . Образец Github более устойчив, демонстрируя дальнейшую настройку.
Из опыта я могу дать вам простой ответ: Всегда порождать задачу с VX_FP_TASK. Особенно, если код можно использовать для различных архитектур.
В зависимости от компилятора (gnu, diab), используемых флагов компиляции и архитектуры регистры с плавающей точки могут использоваться не только для операций с плавающей точкой. В большинстве архитектур регистры FP больше обычных регистров, поэтому они превращаются в идеальных кандидатов для оптимизации кода.
Например, в процессорах PPC603, если вы используете C++ вместо обычного C, регистры FP будут использоваться для оптимизации, и если у вас нет включенной VX_FP_TASK для этой задачи, это может повредить регистры FP другой задачи, даже если она не производит никаких вычислений!
Правильное выполнение более важно, чем производительность, и в большинстве случаев увеличение производительности не оправдывает риск, связанный с его отключением.
Если необходимо убедиться, что флаг включен для всех задач, рекомендуется добавить крючок, который всегда активирует флаг во время создания задачи с помощью TaskCreateTaxingAdd ()
-121--4746241-OK, на всякий случай, если кто-либо еще попадет в это, при вызове веб-служб через автоматически сгенерированные тестовые страницы пользовательские сериализаторы не вызываются - они обходятся. Это, видимо, по замыслу.
-121--4529272- (a) Знаете ли вы, что блокировка файла не помешает другим процессам прикоснуться к нему, если они также не используют блокировки?
(б) Вы должны заблокировать по записываемому каналу. Получите блокировку с помощью RandomStartFile
в режиме «rw», а затем откройте FileInputStream
. Обязательно закройте оба!
Я записал тестовую программу и команды удара для подтверждения эффективности блокировки файла:
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;
public class FileWriterTest
{
public static void main(String[] args) throws Exception
{
if (args.length != 4)
{
System.out.println("Usage: FileWriterTest <filename> <string> <sleep ms> <enable lock>");
System.exit(1);
}
String filename = args[0];
String data = args[1];
int sleep = Integer.parseInt(args[2]);
boolean enableLock = Boolean.parseBoolean(args[3]);
try (RandomAccessFile raFile = new RandomAccessFile(new File(filename), "rw"))
{
FileLock lock = null;
if (enableLock)
{
lock = raFile.getChannel().lock();
}
Thread.sleep(sleep);
raFile.seek(raFile.length());
System.out.println("writing " + data + " in a new line; current pointer = " + raFile.getFilePointer());
raFile.write((data+"\n").getBytes());
if (lock != null)
{
lock.release();
}
}
}
}
Выполнение с этой командой удара для проверки его работает:
for i in {1..1000}
do
java FileWriterTest test.txt $i 10 true &
done
необходимо видеть запись, только происходящую один раз в 10 мс (от выводов), и в конце все числа для присутствования в файле.
Вывод:
/tmp wc -l test.txt
1000 test.txt
/tmp
тот же тест без блокировки показывает потерянные данные:
for i in {1..1000}
do
java FileWriterTest test.txt $i 10 false &
done
Вывод:
/tmp wc -l test.txt
764 test.txt
/tmp
должно быть легко изменить его для тестирования tryLock вместо этого.
Было бы лучше, если бы вы создали блокировку с помощью tryLock (0L, Long.MAX_VALUE, true)
.
Это создает разделяемую блокировку, которая является правильным решением для чтения.
tryLock ()
является сокращением для tryLock (0L, Long.MAX_VALUE, false)
, то есть запрашивает исключительную блокировку записи.