lwzm
3/7/2017 - 3:17 AM

test-multiprocessing.py

#!/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()