Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141

Последовательное выполнение нескольких вызовов скрипта

05.09.2020, 23:03. Показов 4956. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Подскажите пожалуйста как можно реализовать следующую идею.
На ПК запущено несколько скриптов(а), периодически эти скрипты вызывают другой скрипт(b). Как сделать, чтобы пока не выполнится скрипт b, не начиналось параллельное выполнение скрипта b запущенного другим скриптом a.
Например скрит b:
Python
1
2
3
import time
time.sleep(10)
print('Готово')
Если вдруг одновременно будет 2 вызова скрипта b, он должен напечатать через 10 сек, 'Готово', и еще через 10 сек 'Готово'.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.09.2020, 23:03
Ответы с готовыми решениями:

Последовательное выполнение
Недавно начал изучать данный ЯП и столкнулся с проблемой, что после получения 1 сообщения скрипт почему-то начинает все с начала, а не...

Последовательное выполнение команд в cmd
Добрый день. Подскажите пожалуйста, как можно последовательно выполнить данные команды в cmd(cd, dir). Важно именно, последовательно. ...

Последовательное выполнение функций при нажатии на кнопку
Написал код который при нажатии на кнопку выполняет последовательно несколько функций. import sys from Window import * from PyQt5...

11
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
06.09.2020, 09:17
Самое простое решение - это чтобы скрипт b в самом начале выполнения проверял какой-нибудь глобальный флаг (например содержимое файла или поле в БД и т.п.).

В итоге будут две ситуации:
1)Если в файле записано число 0, то скрипт записывает вместо нуля число 1 и начинает выполнение. После выполнения, скрипт записывает в файл опять число 0.
2) Если в файле записано число 1, то скрипт ждёт какое-то время и проверяет содержимое файла снова. И пока в файле не будет записано число 0, скрипт не начнёт свою работу.
0
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
06.09.2020, 13:38  [ТС]
unfindable_404, добрый день. Спасибо, за ответ.Боюсь это не поможет в случае двух одновременных запросов;(
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
06.09.2020, 19:15
Цитата Сообщение от vpip75pfr3 Посмотреть сообщение
Боюсь это не поможет в случае двух одновременных запросов
mutex.
0
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
07.09.2020, 04:43  [ТС]
Garry Galler, подскажите пожалуйста, как именно)
Попробовал вот так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
import threading
import time
 
mutex = threading.Lock()
def safe_plus():
    global protected_resource
    mutex.acquire()
    for i in range(10):
        print(i + 1)
        time.sleep(0.5)
    mutex.release()
safe_plus()
Но не сработало. При одновременном вызове из других скриптов он исполняется.

Добавлено через 1 минуту
unfindable_404, попробовал. К сожалению при абсолютно одновременном вызове не работает. (
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
07.09.2020, 11:49
unfindable_404, с файлами идея не очень.. представьте, что первый скрипт записал 1 в файл и вылетел или завис...
1
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
07.09.2020, 14:23  [ТС]
u235, да, это явный минус. Из свежих идей, это средствами ОС реализовать следующее:
1. Создать пустой файл.
2. Как ни будь сделать, чтобы только 1 копия этого файла/bat итд могла быть запущена ОС Windows
3. И скрипт проверяет, если этот файл не получается открыть он ждет. Если скрипт который открыл этот файл вылетел, то файл сам закроется.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
07.09.2020, 14:51
vpip75pfr3,
НЕ Python мьютекс, а CreateMutex из winAPI.
Вот, прочитай темку и совет камрада Убежденный
Запрет двойного запуска

P.S. Я делал тоже самое для приложения на C# - все отлично работало.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.09.2020, 00:59
Лучший ответ Сообщение было отмечено vpip75pfr3 как решение

Решение

Вот наваял библиотечку (ну как в любят в javascript) - на пару строк :-) - для отслеживания запуска копии приложения.
Вторая (и каждая последующая) копия запустится только после того, как отработает предыдущая.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from win32event import CreateMutex, OpenMutex, ReleaseMutex, INFINITE, WaitForSingleObject
from win32api import CloseHandle, GetLastError
#from winerror import ERROR_ALREADY_EXISTS, ERROR_FILE_NOT_FOUND
import logging
 
logger = logging.getLogger(__name__)
format = logging.Formatter('[%(asctime)s] %(levelname)s: %(message)s')
stream = logging.StreamHandler()
stream.setFormatter(format)
logger.addHandler(stream)
 
 
MUTEX_ALL_ACCESS = 0x1F0001
 
class Singleton:
    """ Limits application to single instance """
    
    def __init__(self, guid:str):
        self.__mutexname = guid
        self.__mutex = None
        self.__already_exist = False
        self.__wait_timeout_msc = INFINITE
    
    @property 
    def name(self):
        return self.__mutexname  
    
    def set_timeout(self, wait:int):
        self.__wait_timeout_msc = wait    
    
    @property 
    def timeout(self):
        return self.__wait_timeout_msc
    
    def __call__(self, wait:int=-1):
        if wait > 0 :
            self.__wait_timeout_msc  = wait   
        try:
            self.__mutex = OpenMutex(MUTEX_ALL_ACCESS, False, self.__mutexname)
            self.__already_exist = True
            logger.debug("OpenMutex %s" % self.__mutex)
        
        except Exception as err:
            logger.debug("ERROR: %s" % err)
            self.__mutex = CreateMutex(None, True, self.__mutexname)
            logger.debug("CreateMutex %s" % self.__mutex)
        else:
            logger.debug(
                    "Another instance of this program is already running: %s" % 
                    self.__mutexname
                )
            logger.debug("WaitForSingleObject start")
            WaitForSingleObject(self.__mutex, self.__wait_timeout_msc)
            logger.debug("WaitForSingleObject end")
           
    def __del__(self):
        if self.__mutex and not self.__already_exist:
            ReleaseMutex(self.__mutex)
            CloseHandle(self.__mutex)
Используем:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from singleinstance import Singleton
import sys
import time
import logging
 
logger = logging.getLogger("singleinstance")
logger.setLevel(logging.DEBUG) # включаем дебаг, чтобы увидеть лог
 
# uuid можно сгенерировать с помощью  str(uuid.uuid4()), но сюда нужно вставлять уже готовый
WaitAppIfRunning = Singleton('6c0223de-03cc-4df7-a0e8-7ac2299cbea4') 
 
if __name__ == "__main__":  
    WaitAppIfRunning() # check is another instance of same program running
    #print(WaitAppIfRunning.name)
    #print(WaitAppIfRunning.timeout)
    #WaitAppIfRunning(5000)  # ждем не более указанного времени в миллисекундах
    # имитация работы приложения  
    # do this at beginnig of your application
    
    print("wait...")
    time.sleep(10)    
    print("done...")
3
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
14.09.2020, 12:40  [ТС]
Garry Galler, добрый день. Ещё раз большое спасибо за Ваши ответы. Можете пожалуйста подсказать, можно ли как то реализовать очередь в Вашем решении? Т.е. если выполняется скрипт1 с мутексом. И поступил ещё запрос на выполнения, вначале от скрипта2 и потом от скрипта3. То следующим будет выполняться именно скрипт2, а потом уже скпипт3 итд?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.09.2020, 14:16
Цитата Сообщение от vpip75pfr3 Посмотреть сообщение
То следующим будет выполняться именно скрипт2, а потом уже скпипт3 итд?
А сейчас как происходит?
1
6 / 2 / 0
Регистрация: 28.06.2019
Сообщений: 141
14.09.2020, 15:01  [ТС]
Garry Galler, не поверил своим глазам....)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2020, 15:01
Помогаю со студенческими работами здесь

Последовательное выполнение тестов в селениум
хотел сделать два независимых теста: авторизация + поиск по сайту, но чтобы запускались один за другим но получается так, что после...

Последовательное выполнение скрипта
Есть <div> с двумя событиями onClick() Первое меняет цвет текста 1 заголовка Второе делает видимым 2 заголовок Как сделать так,...

Последовательное выполнение нескольких запросов
Добрый день! Товарищи, столкнулся с задачей, которую пока не могу сам решить - прошу помощи! Как сейчас я делаю: Изменяю...

Последовательное выполнение нескольких Assert
Всем привет. Прошу подсказать, как внутри тестовой функции реализовать последовательное выполнение нескольких функций ...

Выполнение PHP скрипта для нескольких пользователей
Здравствуйте! У меня имеется скрипт, который запускается по крону каждые 2 минуты, проходит по всей базе пользователей и в зависимости...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru