Моя форма никогда не отправляется с реактивной формой

После того, как вы поймете, что все машины, работающие с полным процессом, в * unix, вы легко найдете более простое решение:

Рассмотрим этот простой пример, как сделать timeoutable communication () meth с помощью select.select () (доступно почти каждый on * nix в настоящее время). Это также можно записать с помощью epoll / poll / kqueue, но вариант select.select () может быть хорошим примером для вас. И основные ограничения select.select () (speed и 1024 max fds) не применимы для вашей задачи.

Это работает под * nix, не создает потоки, не использует сигналы, может быть выделено из любой поток (не только основной) и достаточно быстрый, чтобы читать 250 мб / с данных из stdout на моей машине (i5 2.3ghz).

В конце есть проблема в joinsting stdout / stderr связи. Если у вас огромный выход программы, это может привести к большому использованию памяти. Но вы можете вызывать связь () несколько раз с меньшими тайм-аутами.

class Popen(subprocess.Popen):
    def communicate(self, input=None, timeout=None):
        if timeout is None:
            return subprocess.Popen.communicate(self, input)

        if self.stdin:
            # Flush stdio buffer, this might block if user
            # has been writing to .stdin in an uncontrolled
            # fashion.
            self.stdin.flush()
            if not input:
                self.stdin.close()

        read_set, write_set = [], []
        stdout = stderr = None

        if self.stdin and input:
            write_set.append(self.stdin)
        if self.stdout:
            read_set.append(self.stdout)
            stdout = []
        if self.stderr:
            read_set.append(self.stderr)
            stderr = []

        input_offset = 0
        deadline = time.time() + timeout

        while read_set or write_set:
            try:
                rlist, wlist, xlist = select.select(read_set, write_set, [], max(0, deadline - time.time()))
            except select.error as ex:
                if ex.args[0] == errno.EINTR:
                    continue
                raise

            if not (rlist or wlist):
                # Just break if timeout
                # Since we do not close stdout/stderr/stdin, we can call
                # communicate() several times reading data by smaller pieces.
                break

            if self.stdin in wlist:
                chunk = input[input_offset:input_offset + subprocess._PIPE_BUF]
                try:
                    bytes_written = os.write(self.stdin.fileno(), chunk)
                except OSError as ex:
                    if ex.errno == errno.EPIPE:
                        self.stdin.close()
                        write_set.remove(self.stdin)
                    else:
                        raise
                else:
                    input_offset += bytes_written
                    if input_offset >= len(input):
                        self.stdin.close()
                        write_set.remove(self.stdin)

            # Read stdout / stderr by 1024 bytes
            for fn, tgt in (
                (self.stdout, stdout),
                (self.stderr, stderr),
            ):
                if fn in rlist:
                    data = os.read(fn.fileno(), 1024)
                    if data == '':
                        fn.close()
                        read_set.remove(fn)
                    tgt.append(data)

        if stdout is not None:
            stdout = ''.join(stdout)
        if stderr is not None:
            stderr = ''.join(stderr)

        return (stdout, stderr)
1
задан Jeremy Caillié 15 January 2019 в 22:02
поделиться

1 ответ

О Боже, спасибо Р. Ричардсу, я был настолько удивлен, что мой html-код был верным ... На самом деле, при всей ошибке метки я написал signupForm ['mycontrol'], а не signupForm.controls ['myControl' ].

Спасибо за руководство.

0
ответ дан Jeremy Caillié 15 January 2019 в 22:02
поделиться
Другие вопросы по тегам:

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