Точка входа в приложение (запускаемый python-скрипт) должна быть одна: при входе или запуске пользователь вводит свой id (или он генерируется на основании неких косвенных признаков). Для хранения данных необходимо использовать базу данных. причём, учитывая что вы сразу захотели многопользовательское приложение, необходимо поднять полноценный сервер базы данных (простенький sqlite не прокатит).
Если вы не знакомы с sql, рекомендую начать с знакомства с mongodb и способа взаимодействия с ним через python. Если всёже знакомы, то лучше будет поднять инстанс mysql/postgress/или что вы там знаете, вооружиться библиотекой pyodbc и начать постигать мир полноценного промышленного программирования.
UPD: ответив решил исследовать, нельзя ли стандартный sqlite3 запустить в мультипроцесном режиме -- оказалось костыль есть.
Подключение к базе блокирует другие подключения и они ждут, пока файл освоботится с задержкой timeout. так что если соединения постоянно открывать-зарывать, то сразу несколько процессов могут работать с одной базой (теоретически её можно коннект в picke положить, но это злая идея).
Вот такой код по идее должен справляется с парой десятков пользователей (а главное: никакого сервера):
import sqlite3
import os
import sys
import random
import time
from datetime import datetime
TIMEOUT_DELAY=10
CURRENT_DIRECTORY = os.path.normpath(
os.path.relpath(
os.path.dirname(__file__),
os.getcwd())
)
DB_PATH = os.path.normpath(os.path.join(CURRENT_DIRECTORY, './db/lists.db'))
def initBase():
with sqlite3.connect(DB_PATH) as connect:
cursor = connect.cursor()
cursor.execute("""
CREATE TABLE lists(
userid INTEGER primary key,
value INTEGER
)
""")
connect.commit()
if not os.path.exists(DB_PATH):
os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
initBase()
ID = None
if len(sys.argv) > 1:
ID = int(sys.argv[1])
else:
ID = int(datetime.now().timestamp() * 1000) % 10000 + 10000
print(f'ID не передан. сгенерирован идентефикатор {ID}')
while True:
with sqlite3.connect(DB_PATH, timeout=TIMEOUT_DELAY) as connect:
cursor = connect.cursor()
cursor.execute("""SELECT userid, value FROM lists""")
print(cursor.fetchall())
x = random.randint(100, 999)
cursor.execute("""
INSERT INTO lists(value, userid)
VALUES (?, ?)
ON CONFLICT(userid) DO UPDATE SET
value=?
WHERE userid=?
""", [x, ID]*2)
connect.commit()
time.sleep(1)
открыл 3 консоли и запустил
python3 __main__.py
python3 __main__.py 1
python3 __main__.py 2
вроде работает):
Но лучше всеравно так не делать, а использовать всёже нормальный сервер бд