Предотвращение наследования дескриптора файла в многопроцессорном lib

package com.balance.braces;

import java.util.Arrays;
import java.util.Stack;

public class BalanceBraces {

public static void main(String[] args) {

    String[] values = { "()]", "[()]" };

    String[] rsult = match(values);

    Arrays.stream(rsult).forEach(str -> System.out.println(str));
}

static String[] match(String[] values) {

    String[] returnString = new String[values.length];

    for (int i = 0; i < values.length; i++) {
        String value = values[i];

        if (value.length() % 2 != 0) {
            returnString[i] = "NO";
            continue;
        } else {

            Stack<Character> buffer = new Stack<Character>();
            for (char ch : value.toCharArray()) {

                if (buffer.isEmpty()) {
                    buffer.add(ch);
                } else {
                    if (isMatchedBrace(buffer.peek(), ch)) {
                        buffer.pop();
                    } else {
                        buffer.push(ch);
                    }
                }
                if (buffer.isEmpty()) {
                    returnString[i] = "YES";
                } else {
                    returnString[i] = "FALSE";
                }
            }
        }

    }

    return returnString;
}

static boolean isMatchedBrace(char start, char endmatch) {
    if (start == '{')
        return endmatch == '}';
    if (start == '(')
        return endmatch == ')';
    if (start == '[')
        return endmatch == ']';
    return false;
}

}
11
задан 14256424 4 June 2009 в 01:12
поделиться

3 ответа

Я не знаю о модуле multiprocessing , но с модулем subprocess вы можете указать ему не наследовать никакие файловые дескрипторы:

Если close_fds истинно, все файловые дескрипторы, кроме 0, 1 и 2, будут закрыты до выполнения дочернего процесса. (Только для Unix). Или, в Windows, если close_fds истинно, то дескрипторы не будут унаследованы дочерним процессом. Обратите внимание, что в Windows вы не можете установить для close_fds значение true, а также перенаправить стандартные дескрипторы, установив stdin, stdout или stderr.

В качестве альтернативы вы можете закрыть все файловые дескрипторы в дочернем процессе с помощью os.closerange

Закройте все файловые дескрипторы от fd_low (включительно) до fd_high (исключая), игнорируя ошибки. Доступность: Unix, Windows.

1
ответ дан 3 December 2019 в 11:38
поделиться

После открытия дескриптора файла вы можете использовать функцию SetHandleInformation (). для удаления флага HANDLE_FLAG_INHERIT .

0
ответ дан 3 December 2019 в 11:38
поделиться

Метод fileno () возвращает номер файла, присвоенный библиотекой времени выполнения. Зная номер файла, вы можете затем вызвать msvcrt.get_osfhandle () , чтобы получить дескриптор файла Win32. Используйте этот дескриптор в вызове SetHandleInformation . Таким образом, может сработать что-то вроде следующего:

win32api.SetHandleInformation(
    msvcrt.get_osfhandle(testFile.fileno()),
    win32api.HANDLE_FLAG_INHERIT,
    0)

Я не уверен в точном использовании модуля win32api , но это должно помочь преодолеть разрыв между файловым объектом Python и дескриптором Win32.

4
ответ дан 3 December 2019 в 11:38
поделиться
Другие вопросы по тегам:

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