Асинхронное извлечение информации из процесса - PullRequest
1 голос
/ 04 февраля 2012

Вот псевдокод того, что я хочу сделать.

import time

def run():

    while x < 10000000:
        x += 1

if __name__ == "__main__":

    p = Process(run)
    p.start()

    time.sleep(3)

    #some code that I don't know that will give me the current value of x

Модуль Pythons threading, кажется, путь, однако мне еще не удалось успешно реализовать этот пример.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2012

Ну вот

from multiprocessing import Process, Pipe
import time

def f(conn):
    x = 0
    while x < 10000000:
        if conn.poll():
            if conn.recv() == "get":
                conn.send(x)

        x += 1

    conn.close()

if __name__ == '__main__':

    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()

    time.sleep(2)
    parent_conn.send("get")
    print(parent_conn.recv())

    p.join()

оказалось дубликатом , моя версия просто более общая

0 голосов
/ 04 февраля 2012

Это действительно зависит от того, чего вы пытаетесь достичь, а также от частоты создания и использования памяти ваших подпроцессов.Несколько долгоживущих, и вы можете легко уйти с несколькими процессами уровня ОС (см. Модуль subprocess).Если вы порождаете много маленьких, многопоточность быстрее и требует меньше памяти.Но с многопоточностью вы сталкиваетесь с такими проблемами, как «безопасность потоков», глобальная блокировка интерпретатора и неприятные, скучные вещи, такие как семафоры и тупики.

Стратегии совместного использования данных между двумя процессами или потоками можно условно разделить на две категории: «Давайте разделить блок памяти» (используя Lock s и Mutex es) и «Давайте совместно использовать копии данных»(используя сообщения, каналы или socket s).Метод совместного использования памяти мал, но сложен в управлении, поскольку он означает, что один поток не читает ту же часть разделяемой памяти, что и другой поток, пишет в него, что не является тривиальным и трудным для отладки.Метод копирования тяжелее в памяти, но его легче понять.Кроме того, он имеет явное преимущество, заключающееся в том, что его можно довольно просто перенести в сеть, что позволяет распределенные вычисления.

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

Я бы сказал, начните с чего-то вроде RabbitMQ .

0 голосов
/ 04 февраля 2012

Все, что вам нужно, находится в multiprocessing модуле . Может быть, разделяемая память объект поможет здесь?

Обратите внимание, что на многопоточность в Python влияет Global Interpreter Lock , которая по существу предотвращает многопоточный код Python.

...