[toc]
How do I use concurrent decorators
# process wrapper
from utils import run_in_async_process
@run_in_async_process
def p():
print(" i am son proc")
Copy the code
Process concurrent decorator
By adding this decorator to a function, it can be run as a separate child process
# ************** Concurrent decorator
from multiprocessing import Process,Pipe
from eventlet import spawn,sleep
from functools import wraps
import traceback
def read_msg_from_son_proc(f_conn) :
while True:
msg_poll = f_conn.poll()
if msg_poll:
msg = f_conn.recv()
if msg :
raise Exception(msg)
break
sleep(0.1)
# func: wrap ,func run in other proc ,
# and read Except from son proc
#
#!!!!!! if you want use it not in dead loop ,
# please consider , wait for this func
#
# beacause this is a async wrapper
# so it can't wait for return, it just can get Except in son process
def run_in_async_process(f) :
@wraps(f)
def wrapper(*a,**ka) :
# must be have a conn to send message to father
def wrap_f(*a,**ka) :
msg = ""
conn = ka.pop("conn")
try:
f(*a,**ka)
except:
msg = "{}\nsome error catch by son proc".format(traceback.format_exc())
finally:
conn.send( msg )
exit(0)
f_conn,s_conn = Pipe()
ka.update({"conn":s_conn})
p = Process(target=wrap_f,args= a , kwargs= ka )
p.start()
x = spawn(read_msg_from_son_proc, f_conn)
x.wait()
return wrapper
# *********** end
Copy the code