def call_in_subprocess(func, *args, **kwargs): from infi.storagemodel.base.gevent_wrapper import start_process, get_pipe_context pipe_context = get_pipe_context() with pipe_context as (reader, writer): logger.debug("{} calling {}(args={!r}, kwargs={!r}) on with multiprocessing".format(getpid(), func, args, kwargs)) subprocess = start_process(put_result_in_queue(func), writer, *args, **kwargs) logger.debug("{} multiprocessing pid is {}".format(getpid(), subprocess.pid)) return_value = read_from_queue(reader, subprocess) logger.debug("{} multiprocessing {} returned {!r}".format(getpid(), subprocess.pid, return_value)) ensure_subprocess_dead(subprocess) return return_value
def do_scsi_cdb(sg_device, cdb): from infi.storagemodel.base.gevent_wrapper import start_process, get_pipe_context pipe_context = get_pipe_context() with pipe_context as (reader, writer): logger.debug("{} issuing cdb {!r} on {} with multiprocessing".format(getpid(), cdb, sg_device)) subprocess = start_process(do_scsi_cdb_with_in_process, writer, sg_device, cdb) logger.debug("{} multiprocessing pid is {}".format(getpid(), subprocess.pid)) return_value = read_from_queue(reader, subprocess) logger.debug("{} multiprocessing {} returned {!r}".format(getpid(), subprocess.pid, return_value)) ensure_subprocess_dead(subprocess) if isinstance(return_value, ScsiCheckConditionError): raise ScsiCheckConditionError(return_value.sense_key, return_value.code_name) if isinstance(return_value, ScsiCommandFailed): raise ScsiCommandFailed() return return_value