#python #oop #server #constructor #instance
Вопрос:
Я хочу запустить несколько серверов, как это:
Server 1 Server 2 Server 3
Я уже написал код:
class Server: def __init__(self, index): self.index = index
Мое главное выглядит так:
server1 = Server(1) server1.run()
Итак, мой вопрос таков, как вы можете прочитать в подписи: Как я могу динамически подсчитывать глобальный индекс различных экземпляров (серверов)?
Комментарии:
1. Что вы подразумеваете под «подсчетом»? Вы можете сохранить каждый индекс, указанный вами в списке, если это то, что вам нужно.
2.
servers = [Server(i) for i in range(1, 4)]
?3. Я имею в виду, что с помощью count он динамически подсчитывает переменную, когда я запускаю новую подачу (здесь выполняется новый файл .py).
Ответ №1:
Сохраните общее количество экземпляров в переменной класса.
class Server: instances = 0 def __init__(self): Server.instances = 1 self.index = Server.instances
Решение этой проблемы в нескольких экземплярах требует дополнительной работы. Вы должны использовать файл для хранения счетчика, и вы должны убедиться, что два процесса не борются за то, кто откроет файл следующим. Это должно работать в Linux:
import fcntl class Server: CNTR = 'mycounter.txt' def __init__(self): if not os.path.exists(CNTR): open(CNTR,'w').write('0') fctl.lock( f, fcntl.LOCK_EX ) n = int(open(CNTR).read()) 1 open(CNTR,'w').write(str(n)) fctl.lock( f, fcntl.LOCK_UN ) self.index = n
Комментарии:
1. Спасибо! И как я мог бы это реализовать, если я хочу запускать серверы из разных файлов .py?
2. Это ничего не меняет. Каждый раз, когда вы создаете
Server
экземпляр, он будет получать номер экземпляра. Помните, что когда вы это сделаетеimport Server from myfile
, это будет все тот же объект класса.3. Ну ладно, спасибо! Я никуда не импортирую сервер. Я просто хочу запустить, например, 3 раза файл сервера в трех разных консолях. А затем я хочу увеличить счетчик на 1 для каждого сервера.
4. Подождите, это СОВСЕМ другой вопрос, чем тот, который вы задали. Если вы хотите, чтобы номер сохранялся в разных ПРОЦЕССАХ, то ваш единственный выбор-сохранить номер в файле. Открывайте, читайте, увеличивайте, записывайте. Вы, очевидно, ничего не можете сохранить в памяти, так как у них нет общей памяти.
5. Я знаю, что это другой вопрос, чем я задавал. Я спросил об этом только из интереса. Спасибо, за ответ!