Browse Source

Fix (?) problem on Windows, which hasn't figured processes out yet

Yentl Van Tendeloo 8 years ago
parent
commit
9e8d1559dc
2 changed files with 62 additions and 57 deletions
  1. 54 54
      scripts/execute_model.py
  2. 8 3
      scripts/make_parallel.py

+ 54 - 54
scripts/execute_model.py

@@ -1,6 +1,5 @@
 import random
 import sys
-import multiprocessing
 import glob
 import time
 
@@ -8,56 +7,57 @@ from compile import do_compile
 from link_and_load import link_and_load
 from make_parallel import main
 
-models = []
-code = []
-
-address = sys.argv[1]
-taskname = sys.argv[2]
-files = [a.replace("\\", "/") for a in sum([glob.glob(f) for f in sys.argv[3:]], [])]
-
-for f in files:
-    if f.endswith(".mvc"):
-        models.append(f)
-    elif f.endswith(".alc"):
-        code.append(f)
-    else:
-        print("Unknown file format for file " + f)
-        print("Requires either .mvc or .alc")
-
-def initialize_SCD():
-    import urllib2
-    import urllib
-    import json
-    taskname = random.random()
-
-    while 1:
-        try:
-            # Create new task
-            urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % taskname, "taskname": "task_manager"}))).read()
-            break
-        except:
-            time.sleep(0.01)
-
-    data = []
-    data.append(4)
-    data.append("initialize_SCD")
-    data.append("models/SimpleClassDiagrams")
-    data.append("exit")
-    data.append(2)
-
-    print("Initializing SCD")
-    urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "taskname": taskname}))).read()
-    urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "taskname": taskname}))).read()
-    print("Initialized!")
-
-def do_compile_wrapper(filename, mode, grammar):
-    do_compile(address, filename, str(random.random()), filename, mode, ["--debug"], grammar=grammar)
-
-# Parse all models and upload them
-initialize_SCD()
-
-for m in models:
-    print("[MODEL] %s" % m)
-    do_compile_wrapper(m, "MO", "grammars/modelling.g")
-
-main(address, taskname, code)
+if __name__ == "__main__":
+    models = []
+    code = []
+
+    address = sys.argv[1]
+    taskname = sys.argv[2]
+    files = [a.replace("\\", "/") for a in sum([glob.glob(f) for f in sys.argv[3:]], [])]
+
+    for f in files:
+        if f.endswith(".mvc"):
+            models.append(f)
+        elif f.endswith(".alc"):
+            code.append(f)
+        else:
+            print("Unknown file format for file " + f)
+            print("Requires either .mvc or .alc")
+
+    def initialize_SCD():
+        import urllib2
+        import urllib
+        import json
+        taskname = random.random()
+
+        while 1:
+            try:
+                # Create new task
+                urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "value": '"%s"' % taskname, "taskname": "task_manager"}))).read()
+                break
+            except:
+                time.sleep(0.01)
+
+        data = []
+        data.append(4)
+        data.append("initialize_SCD")
+        data.append("models/SimpleClassDiagrams")
+        data.append("exit")
+        data.append(2)
+
+        print("Initializing SCD")
+        urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "set_input", "data": json.dumps(data), "taskname": taskname}))).read()
+        urllib2.urlopen(urllib2.Request(address, urllib.urlencode({"op": "get_output", "taskname": taskname}))).read()
+        print("Initialized!")
+
+    def do_compile_wrapper(filename, mode, grammar):
+        do_compile(address, filename, str(random.random()), filename, mode, ["--debug"], grammar=grammar)
+
+    # Parse all models and upload them
+    initialize_SCD()
+
+    for m in models:
+        print("[MODEL] %s" % m)
+        do_compile_wrapper(m, "MO", "grammars/modelling.g")
+
+    main(address, taskname, code)

+ 8 - 3
scripts/make_parallel.py

@@ -6,15 +6,21 @@ from link_and_load import link_and_load
 import random
 import multiprocessing
 import glob
+import os
 
 def do_compile_wrapper(args):
     address, taskname, filename = args
     do_compile(address, filename, str(random.random()), filename, "PO", ["--debug"])
 
 def main(address, taskname, files):
-    p = multiprocessing.Pool(multiprocessing.cpu_count() * 2)
     new_files = to_recompile(address, files)
-    p.map(do_compile_wrapper, [[address, taskname, f] for f in new_files])
+    if os.name == "posix":
+        # At least linux decently implements forking, so use as many cores as possible
+        p = multiprocessing.Pool(multiprocessing.cpu_count() * 2)
+        p.map(do_compile_wrapper, [[address, taskname, f] for f in new_files])
+    else:
+        # Other systems are less intelligent, so just do this sequentially
+        map(do_compile_wrapper, [[address, taskname, f] for f in new_files])
     link_and_load(address, taskname, files)
 
 if __name__ == "__main__":
@@ -28,4 +34,3 @@ if __name__ == "__main__":
     files = [a.replace("\\", "/") for a in sum([glob.glob(f) for f in sys.argv[3:]], [])]
 
     main(address, taskname, files)
-