超时结果,如果没有 returns 来自已启动的进程 - Python
Timeout result if nothing returns from started process - Python
functionB
开始 functionA
。我怎么能说如果没有结果来自
假设从 functionB
开始运行 5 秒 return "Nothing returned" 并终止 functionA
进程
def functionA():
value1 = open()
if (value1 != None):
value2 = testcolor()
return value2
else:
value3 = close()
return value3
def functionB():
thread = multiprocessing.Process(name='send_daemon%d', target=functionA)
thread.daemon = True
thread.start()
res = {'status': 'started' ,}
return json.dumps(res)
在你的情况下,当函数 a 结束时 - 它只会自行停止,不需要做任何进一步的事情。
但是如果你需要关闭一个运行进程。两个最简单的选择是:
使用 multiprocessing.Event
启动 functionA,如果设置了事件,则将其关闭。
否则你可以使用一个信号(这可以通过 Process().terminate
访问)——在你这样做之前你可能应该阅读以下内容:
https://docs.python.org/3.4/librar/multiprocessing.html#multiprocessing.Process
特别是:
Warning
If this method is used when the associated process is using a pipe or
queue then the pipe or queue is liable to become corrupted and may
become unusable by other process. Similarly, if the process has
acquired a lock or semaphore etc. then terminating it is liable to
cause other processes to deadlock.
Queue class 有超时,我建议使用:
import multiprocessing
import Queue
def functionA(return_queue):
value1 = open()
if (value1 != None):
value2 = testcolor()
return_queue.put(value2)
else:
value3 = close()
return_queue.put(value3)
def functionB():
return_queue = multiprocessing.Manager().Queue()
proc = multiprocessing.Process(
name='send_daemon%d', target=functionA, args=(return_queue,))
proc.daemon = True
proc.start()
res = {'status': 'started' ,}
try:
# wait for two seconds for the function to return a value
return_value = return_queue.get(timeout=2)
except Queue.Empty:
proc.terminate()
return_value = None
# do something with the return value here
return json.dumps(res)
备注:
- 不要混淆多处理库和线程库。
multiprocessing.Process()
启动一个新的 process,而不是 thread,因此您应该适当地命名您的变量。
- 在您的代码中,您没有准确显示您打算如何从第二个进程中检索或使用 return 值。据我所知,无法检索
multiprocessing.Process()
的 return 值。此队列实现将允许您获取值。
functionB
开始 functionA
。我怎么能说如果没有结果来自
假设从 functionB
开始运行 5 秒 return "Nothing returned" 并终止 functionA
进程
def functionA():
value1 = open()
if (value1 != None):
value2 = testcolor()
return value2
else:
value3 = close()
return value3
def functionB():
thread = multiprocessing.Process(name='send_daemon%d', target=functionA)
thread.daemon = True
thread.start()
res = {'status': 'started' ,}
return json.dumps(res)
在你的情况下,当函数 a 结束时 - 它只会自行停止,不需要做任何进一步的事情。
但是如果你需要关闭一个运行进程。两个最简单的选择是:
使用 multiprocessing.Event
启动 functionA,如果设置了事件,则将其关闭。
否则你可以使用一个信号(这可以通过 Process().terminate
访问)——在你这样做之前你可能应该阅读以下内容:
https://docs.python.org/3.4/librar/multiprocessing.html#multiprocessing.Process
特别是:
Warning If this method is used when the associated process is using a pipe or queue then the pipe or queue is liable to become corrupted and may become unusable by other process. Similarly, if the process has acquired a lock or semaphore etc. then terminating it is liable to cause other processes to deadlock.
Queue class 有超时,我建议使用:
import multiprocessing
import Queue
def functionA(return_queue):
value1 = open()
if (value1 != None):
value2 = testcolor()
return_queue.put(value2)
else:
value3 = close()
return_queue.put(value3)
def functionB():
return_queue = multiprocessing.Manager().Queue()
proc = multiprocessing.Process(
name='send_daemon%d', target=functionA, args=(return_queue,))
proc.daemon = True
proc.start()
res = {'status': 'started' ,}
try:
# wait for two seconds for the function to return a value
return_value = return_queue.get(timeout=2)
except Queue.Empty:
proc.terminate()
return_value = None
# do something with the return value here
return json.dumps(res)
备注:
- 不要混淆多处理库和线程库。
multiprocessing.Process()
启动一个新的 process,而不是 thread,因此您应该适当地命名您的变量。 - 在您的代码中,您没有准确显示您打算如何从第二个进程中检索或使用 return 值。据我所知,无法检索
multiprocessing.Process()
的 return 值。此队列实现将允许您获取值。