Как я синхронизирую два процесса?

Vstatus.Status.growingspeed = (Key2 - Key1)

Вы не можете вычесть os.stat объектов. У вашего кода также есть некоторые другие проблемы. Ваши циклы будут выполняться последовательно, это означает, что ваш первый цикл будет пытаться оценить, насколько быстро записывается файл, не записывая ничего в файл.

import time  # Imports at the top 
import os

class VStatus:
    def __init__(self):  # double underscores around __init__
        self.countspeed = True  # Assignment, not equality test
        self.active = True
        self.growingspeed = 0

status = VStatus()  # Make a VStatus instance

# You need to do the speed estimation and file appending in the same loop

with open('file.txt', 'a+') as f:  # Only open the file once
    start = time.time()  # Get the current time
    starting_size = os.fstat(f.fileno()).st_size
    while status.active:  # Access the attribute of the VStatus instance
        size = os.fstat(f.fileno()).st_size  # Send file desciptor to stat
        f.write('W')  # Writing more than one character at a time will be your biggest speed up
        f.flush()  # make sure the byte is written
        if status.countspeed:
            diff = time.time() - start
            if diff >= 1:  # More than a second has gone by
                status.countspeed = False
                status.growingspeed = (os.fstat(f.fileno()).st_size - starting_size)/diff  # get rate of growth
        else:
            print(f"size: {size} at a speed of {status.growingspeed}")
6
задан humble_guru 30 October 2008 в 00:29
поделиться

5 ответов

Семафор POSIX является способом пойти. Так как Вы хотите совместно использовать тот же семафор через процессы, необходимо использовать именованный семафор.:

Именованный семафор определяется названием формы/somename. Два процесса могут воздействовать на тот же именованный семафор путем передачи того же имени к sem_open (3).

9
ответ дан 8 December 2019 в 12:23
поделиться

Используйте семафоры POSIX.

2
ответ дан 8 December 2019 в 12:23
поделиться

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

Все они основаны на идее (и обычно на действительности) теста-и-набора или других атомарных операций, выполненных на общую память.

Если Вы ожидаете распределять свои процессы по сети, то семафоры и взаимные исключения не могут быть правильными для Вас - они только работают над единственной машиной. Каналы и сокеты в более общем плане расширяемы сетью.

Краткий обзор взаимных исключений, условных переменных и семафоров:

Взаимные исключения

Взаимное исключение является примитивом, который может быть или заблокирован или разблокирован. Процесс/поток, который заблокировал его, должен быть тем для разблокирования его. Этот аспект владения позволяет операционной системе применять некоторую интересную оптимизацию, такую как наследование приоритета и приоритетный протокол потолка (для предотвращения смены приоритетов). однако, взаимному исключению не связали количество с ним. Вы уже не можете заблокировать заблокированное взаимное исключение, в целом, и сохранить память, что это было "заблокировано дважды" (существуют некоторые расширения, которые позволяют это, я думаю, но они не доступны везде),

Условные переменные

Взаимное исключение является большим для... хорошо, Взаимное исключение. Но что, если необходимо заблокироваться на условии, связанном с объектом, к которому у Вас есть взаимное исключение? Для этого Вы используете условную переменную или CV. CV связан со взаимным исключением. Например, скажите, что у меня есть очередь входных данных, к которым мои процессы хотят получить доступ. Каждый захватывает взаимное исключение, таким образом, оно может посмотреть на очередь без страха перед интерференцией. Однако это находит очередь пустой и хочет ожидать чего-то для вхождения на очереди. Это поэтому ожидает на "очереди не пустая" условная переменная. Интересная часть здесь - то, что, потому что CV связан со взаимным исключением, взаимное исключение автоматически повторно получено, после того как условная переменная сообщена. Таким образом, после того как процесс просыпается после ожидания на CV, это знает, что имеет эксклюзивный доступ снова к очереди. То, что это не знает, - есть ли у очереди действительно что-нибудь на нем - возможно, два процесса ожидали на CV - одна вещь вошла - и первоочередная задача, в которую входят, и исключила "вещь" из очереди, прежде чем вторая вещь проснулась. Таким образом, каждый раз, когда Вы используете CV, необходимо ПЕРЕПРОВЕРИТЬ условие, как это:

mutex_enter(m);
while (! condition) {
   cond_wait(m, c); // drop mutex lock;  wait on cv;  reacquire mutex
}
//processing related to condition
mutex_exit(m);

Семафоры

Хорошо, это - взаимные исключения и условные переменные. Семафоры более просты. Они могут быть увеличены и постепенно уменьшены любыми процессами. У них есть память - они рассчитывают - таким образом, можно использовать их для определения, сколько из условия произошло. Не так с condiiton переменными. Кроме того, потому что семафоры могут быть постепенно уменьшены одним процессом и увеличены другим, у них нет аспекта владения - так никакое наследование приоритета, никакое предотвращение смены приоритетов не возможно.

Теперь, наконец - все эти механизмы требуют общей памяти для эффективного внедрения. Это может быть хорошо для Вас, но знать - если Вы полагаете, что Ваше приложение может в конечном счете быть распределено, затем взаимные исключения, условные переменные и семафоры не могут быть для Вас. Каналы и сокеты, в то время как много более высоких издержек, имеют возможность того, чтобы быть расширенным по сети справедливо прямо.

4
ответ дан 8 December 2019 в 12:23
поделиться

Так как Вам только нужно семафорное количество одного, взаимное исключение достаточно.

2
ответ дан 8 December 2019 в 12:23
поделиться

Я принимаю это

... это совместно используется двумя приложениями?

средства, которые Вы хотите эти две вещи выполнить как отдельные процессы? Если это не верно, и они работают как единственный процесс (с несколькими потоками), то предложения семафоров и взаимных исключений являются наилучшим вариантом и должны быть довольно простыми.

Обратите внимание, что ответ будет зависеть от точно, как Вы получаете доступ к этим аппаратным средствам. Например, если это выставляется через файл затем, нормальный захват файла может использоваться.

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

Если помещение всего прямого доступа к оборудованию в единственный процесс не является соответствующим затем, необходимо будет использовать надлежащую схему синхронизации. Я исследовал бы использование любого файла блокировки (и реализовал бы элементарную взаимоисключающую схему), или использование именованных семафоров (как albertb предположил),

1
ответ дан 8 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

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