ciph / multi_locker.py
t5
apple
0e6f104
import sys,os
from collections import defaultdict
import multiprocessing
from multiprocessing import Lock, Process, Event
from multiprocessing.managers import SyncManager
from contextlib import contextmanager
class multi_locker:
def __init__(zl):
zl.lock = Lock()
zl.lockli = defaultdict(Lock)
zl.event_lock = Lock()
zl.eventli = defaultdict(Event)
def acquire(zl, name):
with zl.lock:
lock = zl.lockli[name]
lock.acquire()
def release(zl, name):
with zl.lock:
lock = zl.lockli[name]
lock.release()
"event"
def notready(zl, name):
with zl.event_lock:
ev = zl.eventli[name]
ev.clear()
def wait(zl, name, timeout=None):
with zl.event_lock:
ev = zl.eventli[name]
ev.wait(timeout=timeout)
def ready(zl, name):
with zl.event_lock:
ev = zl.eventli[name]
ev.set()
f=""
def fil(zl,*w,**W):
zl.f+=str(w)
return zl.f
def fil2(zl):return zl
#
def fwfw(*w):fwfw
def fin2(*w):
if "need to start with start()":
mana.shutdown()
def fin(*w):sys.exit()# not
"not unicorn"
def meg(zl,name):1
def locker(zl, name):
return zl.lockli[name]
class maimai(SyncManager): pass
maimai.register('multi_locker', multi_locker)
from multiprocessing.managers import BaseProxy
class pr(BaseProxy):
def acquire(zl, name: str):
return zl._callmethod('acquire', (name,))
def release(zl, name: str):
return zl._callmethod('release', (name,))
def __getattr__(zl,at):
def fp(*w,**W):
return zl._callmethod(at, w,W)
return fp
@contextmanager
def locker(zl, name: str):
zl.acquire(name)
try:
yield None
finally:
zl.release(name)
if 1:
port=6969
def main():
global mana
#maimai.register('n', lambda:multi_locker(), proxytype=pr)
one=multi_locker()
maimai.register('one', lambda:one)
_mana=mana=maimai(("localhost",port),b"p")
mana.get_server().serve_forever()
#mana.start()# cant pickle "lambda"
#mana.shutdown()
print("mana")
return mana
def browser(port):
_mana=mana=maimai(("localhost",port),b"p")
mana.connect()
mana.register('one',None,pr)
return mana.one().locker
def iniport(port):
import subprocess
from mlwebOrWeb import chkbind
if chkbind(port):
subprocess.Popen(["py",__file__, f'{port}'])
from multiprocessing import freeze_support
if __name__ == '__main__':
freeze_support() # ?
main()