Skip to content

Instantly share code, notes, and snippets.

@novicecpp
Created June 11, 2024 14:18
Show Gist options
  • Save novicecpp/94ba6401e1a4d5298263616f047734f7 to your computer and use it in GitHub Desktop.
Save novicecpp/94ba6401e1a4d5298263616f047734f7 to your computer and use it in GitHub Desktop.
import time
import queue
import sys
import ctypes
import multiprocessing as mp
import traceback
def fn(n, out_q):
print(f'return {n}*5')
result = n*5
out_q.put(result)
def fn_timeout(n, out_q):
print('sleeping 11 secs')
time.sleep(11)
result = n*5
out_q.put(result)
def fn_exception(n, out_q):
try:
time.sleep(1)
raise TypeError('just raise')
result = n*5
out_q.put(result)
except Exception as e:
out_q.put(e)
def fn_coredump(n, out_q):
time.sleep(1)
#https://codegolf.stackexchange.com/a/22383
ctypes.string_at(1)
result = n*5
out_q.put(result)
print('running..')
try:
outqueue = mp.Queue(maxsize=1)
p = mp.Process(target=fn, args=(5, outqueue))
p.start()
p.join(timeout=5)
result = outqueue.get()
print(f'result = {result}')
except Exception as e:
print(f'exception {type(e)}')
print('running timeout')
try:
outqueue = mp.Queue(maxsize=1)
p = mp.Process(target=fn_timeout, args=(6, outqueue))
p.start()
p.join(timeout=5)
result = outqueue.get(timeout=0)
print(f'result = {result}')
except queue.Empty as e:
print(type(e), ''.join(traceback.format_tb(e.__traceback__)))
p.terminate()
print('this is timeout')
print('running exception')
try:
outqueue = mp.Queue(maxsize=1)
p = mp.Process(target=fn_exception, args=(6, outqueue))
p.start()
p.join(timeout=5)
result = outqueue.get(timeout=0)
if type(result) != int:
raise result
else:
print(f'result = {result}')
except Exception as e:
print(type(e), ''.join(traceback.format_tb(e.__traceback__)))
print('this is exception')
print('running coredump')
try:
outqueue = mp.Queue(maxsize=1)
p = mp.Process(target=fn_coredump, args=(6, outqueue))
p.start()
p.join(timeout=5)
result = outqueue.get(timeout=0)
print(f'result = {result}')
except queue.Empty as e:
if not p.is_alive() and p.exitcode < 0: # sigsegv is -11
print(f'exitcode: {p.exitcode}')
print(type(e), ''.join(traceback.format_tb(e.__traceback__)))
print('this is coredump')
else:
print('timeout but still alive and has unexpected exitcode. unexpected')
except Exception as e:
print(type(e), ''.join(traceback.format_tb(e.__traceback__)))
print('unexpect')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment