Нити Python3 не работают параллельно [дубликат]

Вы можете использовать функции empty () и isset (). Если вы хотите, чтобы он работал с разными файлами, просто измените action='yourphp.php' на html, который я вам даю, и store the PHP script на этот файл yourphp.php. Также вам нужно изменить index.html на index.php, чтобы активировать функции PHP.

PHP

<?php

    error_reporting(0);
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";


    if ($_POST['submit']){
                if (!(empty($_POST['name']))) {
                        if (!(empty($_POST['email']))){
                            if (!(empty($_POST['message']))){
                                mail ($to, $subject, $body, $from);
                                echo '<p>Your message has been sent!</p>';
                            }else{
                                echo '<p>Fill your message please.</p>';}
                        }else {
                            echo '<p>Fill your email please.</p>';}
                }else{
                    echo '<p>Fill your name please.</p>';}              
    }else{
            echo '<p>Fill the form.</p>';}
?>

HTML

<html>
    <form method="post" action="?">
        <table>
            <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
            <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
            <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
            <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
        </table>
    </form>
</html>

С наилучшими пожеланиями!

55
задан Laurel 13 April 2016 в 00:21
поделиться

2 ответа

GIL не предотвращает резьбу. Все GIL делает, чтобы только один поток выполнял код Python за раз; управление все еще переключается между потоками.

То, что GIL предотвращает, использует более одного ядра процессора или отдельных процессоров для параллельного запуска потоков.

Это относится только к коду Python , Расширения C могут и освобождают GIL, чтобы позволить нескольким потокам кода C и одному потоку Python работать через несколько ядер. Это распространяется на операции ввода / вывода, управляемые ядром, такие как select() вызовы для чтения и записи сокетов, что позволяет Python обрабатывать сетевые события с достаточной эффективностью в многопоточной многоядерной установке.

Сколько серверов развертывания затем выполняются, запускается более одного процесса Python, чтобы позволить ОС обрабатывать планирование между процессами для использования ваших процессорных ядер до максимума. Вы также можете использовать библиотеку multiprocessing для обработки параллельной обработки нескольких процессов из одного кода и родительского процесса, если это подходит для ваших случаев использования.

Обратите внимание, что только GIL применимы к реализации CPython; Jython и IronPython используют другую реализацию потоковой передачи (собственные встроенные потоки Java VM и .NET соответственно).

Для прямого обращения к вашему обновлению: любая задача, которая пытается получить ускорение скорости от параллельного выполнения, используя чистые Python, не будет видеть ускорение, поскольку поточный код Python блокируется для одного потока, выполняемого за раз. Однако, если вы смешиваете только C-расширения и ввод-вывод (например, операции PIL или numpy), и любой C-код может работать параллельно с одним активным потоком Python.

Python threading отлично подходит для создания гибкого графического интерфейса или для обработки нескольких коротких веб-запросов, где ввод-вывод является узким местом больше, чем код Python. Он не подходит для распараллеливания вычислительно интенсивного кода Python, придерживаться модуля multiprocessing для таких задач или делегировать выделенную внешнюю библиотеку.

73
ответ дан Martijn Pieters 20 August 2018 в 23:22
поделиться
  • 1
    Спасибо @MartijnPieters, тогда у меня есть более ясный ответ на мой вопрос о том, можно ли использовать потоки для ускорения кода, такого как for-loop, который является «no». Возможно, вы или кто-то может написать новый ответ, который я могу принять, который содержит некоторые конкретные примеры общих модулей / кодов / операций, в которых потоки будут разрешены GIL для запуска paralell и, следовательно, быстрее (например, примеры этих операций ввода-вывода и сети / упомянутые операции чтения сокетов и любые другие случаи, когда многопоточность в Python полезна). Может быть, хороший список обычных многопоточных приложений и некоторые примеры программирования, если это возможно? – Karim Bahgat 6 January 2014 в 19:15
  • 2
    Нет, я не думаю, что такой ответ был бы очень полезен; Если честно. Вы не можете создать исчерпывающий список, но правило большого пальца состоит в том, что любые операции ввода / вывода (чтение и запись файлов, сетевые сокеты, трубы) обрабатываются на C, а множество библиотек C также выпускают GIL для их операций, но библиотеки должны документировать это для вас. – Martijn Pieters♦ 6 January 2014 в 19:19
  • 3
    Мой плохой, не видел ваш обновленный ответ до сих пор, где вы дали несколько хороших примеров использования потоков. К ним относятся (исправить меня, если Im неправильно) сетевое программирование (например, urllib.urlopen()?), Вызвать один скрипт Python из GUI Python и вызвать несколько PIL (например, Image.transform()) и numpy ( например numpy.array()) операций с потоками. И вы предоставили еще несколько примеров в своем комментарии, например, используя несколько потоков для чтения файлов (например, f.read()?). Я знаю, что исчерпывающий список невозможен, просто нужны типы примеров, которые вы указали в своем обновлении. В любом случае, принял ваш ответ :) – Karim Bahgat 6 January 2014 в 19:50
  • 4
    @KarimBahgat: Да, urllib.urlopen() будет вызывать сетевые сокеты, ожидая ввода-вывода сокетов - прекрасная возможность переключать потоки и делать что-то еще. – Martijn Pieters♦ 6 January 2014 в 19:52
  • 5
    Хотя это не имеет прямого отношения к этой проблеме, стоит отметить, что иногда потоки не касаются производительности вообще; может быть проще написать код как несколько независимых потоков выполнения. Например, у вас может быть один поток, воспроизводящий фоновую музыку, один, обслуживающий пользовательский интерфейс, и один отрыв от вычислений, которые должны быть выполнены в конце концов, но не в спешке. Попытка последовательности воспроизведения следующего звукового буфера с помощью панели управления пользовательского интерфейса или разбиение ваших вычислений на небольшие кусочки, чтобы не мешать интерактивности, может быть намного сложнее, чем использование потоков. – abarnert 11 August 2014 в 08:10

Да. :)

У вас есть модуль нижнего уровня thread и более высокий уровень threading . Но вы просто хотите использовать многоядерные машины, модуль multiprocessing - это путь.

Цитата из docs :

< blockquote>

В CPython из-за блокировки Global Interpreter Lock только один поток может выполнять код Python сразу (хотя определенные библиотеки, ориентированные на производительность, могут преодолеть это ограничение). Если вы хотите, чтобы ваше приложение лучше использовало вычислительные ресурсы многоядерных машин, вам рекомендуется использовать многопроцессорную обработку. Тем не менее, потоковая передача по-прежнему является подходящей моделью, если вы хотите одновременно запускать несколько задач с привязкой к I / O.

1
ответ дан zord 20 August 2018 в 23:22
поделиться
Другие вопросы по тегам:

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