virtual hardware
#!/usr/bin/python # %parallel_proc ["--add"|"--sub"], [--A a], [--B b]] import argparse def decoder(): """ decoder Add, Sub """ parser = argparse.ArgumentParser(description='Process Proc') parser.add_argument('--add', action='store_true', default=False, dest='add', help='add') parser.add_argument('--sub', action='store_true', default=False, dest='sub', help='sub') parser.add_argument('--A', action='store', type=int, default=10, dest='a', help='A') parser.add_argument('--B', action='store', type=int, default=10, dest='b', help='B') parser.add_argument('--t', action='store', type=int, default=10, dest='t', help='time') args = parser.parse_args() if args.add: if args.t < 2: print "add %d" %(proc_add(args.a, args.b)) else: print "idle %d" %(2) elif args.sub: if args.t < 3: print "sub %d" %(proc_sub(args.a, args.b)) else: print "idle %d" %(3) def proc_add(a, b): return a + b def proc_sub(a, b): return a - b def main(): decoder() if __name__ == '__main__': main()download
#! /usr/bin/python import subprocess import sys import re reIDLE = re.compile("idle\s+(\w+)", re.M) reADD = re.compile("add\s+(\w+)", re.M) reSUB = re.compile("sub\s+(\w+)", re.M) def spawn_add(a=0, b=0, cycle=0): proc = subprocess.Popen("./parallel_proc.py --add --A %d --B %d --t %d" %(a, b, cycle), \ shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) id(proc) proc.wait() line = proc.stdout.readline() idle = reIDLE.findall(line) add = reADD.findall(line) ret_idle = 0 if not idle else idle[0] ret_add = 0 if not add else add[0] return (ret_idle, ret_add) def spawn_sub(a=0, b=0, cycle=0): proc = subprocess.Popen("./parallel_proc.py --sub --A %d --B %d --t %d" %(a, b, cycle), \ shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) id(proc) proc.wait() line = proc.stdout.readline() idle = reIDLE.findall(line) sub = reADD.findall(line) ret_idle = 0 if not idle else idle[0] ret_sub = 0 if not sub else sub[0] return (ret_idle, ret_sub) def main(): # (2+3)+(4-2) # time 1 2+3, 4-2 # time 2 2+3, 4-2 # time 3 , 4-2 # time 4 5 , 2 status = 'start' add = { 'a' : 2, 'b' : 3, 'cyc' : 4 } sub = { 'a' : 4, 'b' : 2, 'cyc' : 5 } def status_inspect(add_idle=0, sub_idle=0): if add_idle != 0 and sub_idle != 0 : add['cyc'] -= add_idle sub['cyc'] -= sub_idle status = 'start' elif add_idle != 0 and sub_idle == 0: add['cyc'] -= add_idle status = 'idle_add' elif add_idle == 0 and sub_idle != 0: sub['cyc'] -= sub_idle status = 'idle_sub' else: return True return False while True: if status == 'start': (add_idle, add_val) = spawn_add(add['a'], add['b'], add['cyc']) (sub_idle, sub_val) = spawn_sub(sub['a'], sub['b'], sub['cyc']) if status_inspect(int(add_idle), int(sub_idle)): break elif status == 'idle_add': (add_idle, add_val) = spawn_add(add['a'], add['b'], add['cyc']) if status_inspect(int(add_idle), int(sub_idle)): break elif status == 'idle_sub': (sub_idle, sub_val) = spawn_sub(sub['a'], sub['b'], sub['cyc']) if status_inspect(int(add_idle), int(sub_idle)): break else: break if __name__ == '__main__': main()download
沒有留言:
張貼留言