Существует код Python, содержащий декоратор singleton_process и декодируемую функцию hello. Декоратор предназначен для защиты от повторного запуска скрипта в другом терминале/процессе.
from multiprocessing import shared_memory
import time
import os
import sys
def singleton_process(*args, **kwargs):
def wrapper(func):
flag = True
try:
shared_name = kwargs.get('shared_name')
shm = shared_memory.SharedMemory(
name=shared_name,
create=True,
size=1
)
print("The first copy of the script has been launched.")
func()
except FileExistsError:
flag = False
print("Another instance of the script is already running.")
sys.exit(1)
except KeyboardInterrupt:
shm.close()
shm.unlink()
finally:
if flag:
shm.close()
try:
shm.unlink()
except FileNotFoundError:
pass
return wrapper
@singleton_process(shared_name='my_lock')
def hello():
c = 0
while True:
c += 1
if c == 5:
break
pid = os.getpid()
print(f'PID={pid}. Script it work...')
time.sleep(1)
return True
if __name__ == '__main__':
#print('output=', type(hello))
#hello()
pass
Код автоматически вызывает декодируемую функцию, даже если его об этом явно не просят. Как я могу исправить скрипт и заставить его запускать функцию hello() только в операторе if __name__ == «__main__»?
Существует код Python, содержащий декоратор singleton_process и декодируемую функцию hello. Декоратор предназначен для защиты от повторного запуска скрипта в другом терминале/процессе. [code]from multiprocessing import shared_memory import time import os import sys
def singleton_process(*args, **kwargs): def wrapper(func): flag = True try: shared_name = kwargs.get('shared_name') shm = shared_memory.SharedMemory( name=shared_name, create=True, size=1 ) print("The first copy of the script has been launched.") func() except FileExistsError: flag = False print("Another instance of the script is already running.") sys.exit(1) except KeyboardInterrupt: shm.close() shm.unlink() finally: if flag: shm.close() try: shm.unlink() except FileNotFoundError: pass
return wrapper
@singleton_process(shared_name='my_lock') def hello(): c = 0 while True: c += 1 if c == 5: break pid = os.getpid() print(f'PID={pid}. Script it work...') time.sleep(1) return True
if __name__ == '__main__': #print('output=', type(hello)) #hello() pass [/code] Код автоматически вызывает декодируемую функцию, даже если его об этом явно не просят. Как я могу исправить скрипт и заставить его запускать функцию hello() только в операторе if __name__ == «__main__»?