Skip to content

Commit 306e131

Browse files
committed
tests: Factor test scripts into separate files
This will make it easier to maintain these compared to the previous nested triple quoted strings. Signed-off-by: Matt Wozniski <mwozniski@bloomberg.net>
1 parent 3c925b3 commit 306e131

6 files changed

Lines changed: 220 additions & 239 deletions
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import sys
2+
import threading
3+
import time
4+
5+
from subinterpreters_shim import run_in_new_interpreter
6+
7+
fifo = sys.argv[1]
8+
9+
inner_code = f"""
10+
import time
11+
12+
with open({fifo!r}, "w") as f:
13+
f.write("ready")
14+
15+
while True:
16+
time.sleep(1)
17+
"""
18+
19+
outer_code = f"""
20+
import sys
21+
sys.path.insert(0, {sys.path[0]!r})
22+
23+
from subinterpreters_shim import run_in_new_interpreter
24+
run_in_new_interpreter({inner_code!r})
25+
"""
26+
27+
t = threading.Thread(target=run_in_new_interpreter, args=(outer_code,))
28+
t.start()
29+
30+
while True:
31+
time.sleep(1)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import os
2+
import sys
3+
import threading
4+
import time
5+
6+
from subinterpreters_shim import run_in_new_interpreter
7+
8+
NUM_INTERPRETERS = 3
9+
10+
r_fd, w_fd = os.pipe()
11+
12+
13+
def start_interpreter_async(code):
14+
t = threading.Thread(target=run_in_new_interpreter, args=(code,))
15+
t.start()
16+
17+
18+
CODE = f"""
19+
import os
20+
import time
21+
22+
os.write({w_fd}, b"x")
23+
24+
while True:
25+
time.sleep(1)
26+
"""
27+
28+
for _ in range(NUM_INTERPRETERS):
29+
start_interpreter_async(CODE)
30+
31+
data = b""
32+
while len(data) < NUM_INTERPRETERS:
33+
data += os.read(r_fd, NUM_INTERPRETERS - len(data))
34+
os.close(r_fd)
35+
os.close(w_fd)
36+
37+
fifo = sys.argv[1]
38+
with open(fifo, "w") as f:
39+
f.write("ready")
40+
41+
while True:
42+
time.sleep(1)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
try:
2+
from concurrent import interpreters
3+
4+
def run_in_new_interpreter(code):
5+
interpreters.create().exec(code)
6+
7+
except ImportError:
8+
try:
9+
import _interpreters
10+
11+
def run_in_new_interpreter(code):
12+
_interpreters.exec(_interpreters.create(), code)
13+
14+
except ImportError:
15+
import _xxsubinterpreters
16+
17+
def run_in_new_interpreter(code):
18+
_xxsubinterpreters.run_string(
19+
_xxsubinterpreters.create(isolated=False), code
20+
)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import os
2+
import sys
3+
import threading
4+
import time
5+
6+
from subinterpreters_shim import run_in_new_interpreter
7+
8+
r_fd, w_fd = os.pipe()
9+
10+
11+
def launch_chain():
12+
level3_code = f"import os, time; os.write({w_fd}, b'x'); time.sleep(86400)"
13+
level2_code = (
14+
f"import sys; sys.path.insert(0, {sys.path[0]!r}); "
15+
f"from subinterpreters_shim import run_in_new_interpreter as f;"
16+
f"f({level3_code!r})"
17+
)
18+
level1_code = (
19+
f"import sys; sys.path.insert(0, {sys.path[0]!r}); "
20+
f"from subinterpreters_shim import run_in_new_interpreter as f;"
21+
f"f({level2_code!r})"
22+
)
23+
run_in_new_interpreter(level1_code)
24+
25+
26+
t1 = threading.Thread(target=launch_chain, daemon=True)
27+
t2 = threading.Thread(target=launch_chain, daemon=True)
28+
t1.start()
29+
t2.start()
30+
31+
data = b""
32+
while len(data) < 2:
33+
data += os.read(r_fd, 2 - len(data))
34+
os.close(r_fd)
35+
os.close(w_fd)
36+
37+
fifo = sys.argv[1]
38+
with open(fifo, "w") as f:
39+
f.write("ready")
40+
41+
while True:
42+
time.sleep(1)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import os
2+
import sys
3+
import threading
4+
import time
5+
6+
from subinterpreters_shim import run_in_new_interpreter
7+
8+
NUM_INTERPRETERS = 2
9+
NUM_THREADS_PER_SUBINTERPRETER = 2
10+
11+
r_fd, w_fd = os.pipe()
12+
13+
14+
def start_interpreter_async(code):
15+
t = threading.Thread(target=run_in_new_interpreter, args=(code,))
16+
t.daemon = True
17+
t.start()
18+
return t
19+
20+
21+
CODE = """\
22+
import os
23+
import threading
24+
import time
25+
26+
NUM_THREADS = 2
27+
28+
def worker():
29+
os.write(%d, b"x")
30+
while True:
31+
time.sleep(1)
32+
33+
threads = []
34+
for _ in range(NUM_THREADS):
35+
t = threading.Thread(target=worker)
36+
t.start()
37+
threads.append(t)
38+
39+
os.write(%d, b"x")
40+
while True:
41+
time.sleep(1)
42+
""" % (w_fd, w_fd)
43+
44+
threads = []
45+
for _ in range(NUM_INTERPRETERS):
46+
t = start_interpreter_async(CODE)
47+
threads.append(t)
48+
49+
TOTAL_EXPECTED = NUM_INTERPRETERS * (NUM_THREADS_PER_SUBINTERPRETER + 1)
50+
51+
data = b""
52+
while len(data) < TOTAL_EXPECTED:
53+
data += os.read(r_fd, TOTAL_EXPECTED - len(data))
54+
os.close(r_fd)
55+
os.close(w_fd)
56+
57+
fifo = sys.argv[1]
58+
with open(fifo, "w") as f:
59+
f.write("ready")
60+
61+
while True:
62+
time.sleep(1)

0 commit comments

Comments
 (0)