#!/usr/bin/env python3
import time
import sys
import os
import resource
import tempfile
def run(n):
resource.setrlimit(resource.RLIMIT_CPU, (1, -1))
o = sum(range(n))
resource.setrlimit(resource.RLIMIT_CPU, (-1, -1))
o
o
return o
limits = [s for s in dir(resource) if s.startswith("RLIMIT_")]
usages = [s for s in dir(resource) if s.startswith("RUSAGE_")]
for k in limits:
print(k, *resource.getrlimit(getattr(resource, k)))
for k in usages:
print(k, getattr(resource, k))
def main():
for i in range(300):
#input("...")
f = tempfile.TemporaryFile()
if os.fork():
pid, status = os.wait()
print(pid, status & 0xFF, status >> 8, os.times())
f.seek(0)
bs = f.read()
assert i == len(bs)-10000, bs
#print(resource.getrusage(resource.RUSAGE_CHILDREN))
else:
f.write(b'x' * (i+10000))
f.flush()
#input('child') # at here, you can try kill -ALRM/TERM/KILL <PID>
run(40000000)
#print(resource.getrusage(resource.RUSAGE_SELF))
exit(0)
#exit(i) # wait().status >> 8 == exit(N)
if __name__ == '__main__':
main()
#!/usr/bin/env python3
import atexit
import os
import signal
import time
import multiprocessing
import traceback
import tornadospy
def g():
while True:
try:
yield input()
except EOFError:
break
def f(i):
signal.alarm(10)
time.sleep(2)
signal.alarm(0)
return 1/float(i)
def sig_alrm(*_):
raise TimeoutError("SIGALRM")
def exit():
print("exit", os.getpid())
def init():
signal.signal(signal.SIGALRM, sig_alrm)
print("init", os.getpid())
def succ(result):
print(result)
def fail(result):
print(result, type(result), repr(result))
def main():
atexit.register(exit)
with multiprocessing.Pool(4, initializer=init, maxtasksperchild=100) as p, tornadospy.env:
tornadospy.p = p
for i in g():
result = p.apply_async(f, (i,), callback=succ, error_callback=fail)
if __name__ == "__main__":
main()
#!/usr/bin/env python3
import os
import time
import multiprocessing
#print('init')
def test(a):
print(time.time(), os.getpid(), a)
if os.fork():
print(os.wait())
else:
time.sleep(100)
def main():
# https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods
mp = multiprocessing.get_context('spawn')
print(time.time(), os.getpid())
l = list(range(1000*1000*10))
f = open('not-inherited', "w")
ps = []
for i in range(10):
p = mp.Process(target=test, args=([1,2,3],))
p.start()
ps.append(p)
for p in ps:
print(p.join())
if __name__ == "__main__":
main()