基于这个线程,在Python中,可以使用multiprocessing.Queue检索函数的返回值(一个可变长度的字符串)。但这实际上涉及到修改函数本身(通过返回Q.put(retval)
而不是retval
)。
如果不能修改函数(例如,因为它是按原样设计的,也用于其他目的,例如不涉及调用新线程的其他用法)?它仍然可以很容易地获得返回的字符串值从这个函数时,通过多处理库调用?如果是,怎么做?
其实,答案很简单。如果你不能修改函数本身,你可以用一个新函数来封装它,例如:
def function_wraper(**kwargs):
Q.put(unmodified_function(**kwargs))
然后,调用它如下:
import multiprocessing
def unmodified_function(**kwargs):
return ', '.join([f'{v}' for v in kwargs.values()])+' !'
def run_function_as_new_thread(func=unmodified_function, args=(), kwargs=None):
procs = []
p = multiprocessing.Process(
target=func,
args=args,
kwargs=kwargs,
name = (f"Process")
)
procs.append(p)
p.start()
for p in procs:
p.join()
return True
kwargs = {"hello": "Bonjour", "world": "le monde"}
Q = multiprocessing.Queue() # Q has to be defined before using function_wraper()
_ = run_function_as_new_thread(
func=function_wraper,
args = (),
kwargs=kwargs
)
if not Q.empty():
resulting_string = Q.get()
print(resulting_string)
else:
print('nothing to print...')
这将打印Bonjour le monde !
。
在我的情况下,这是工作的,因为我的功能是接受kwargs
,所以你可能不得不调整,如果你的功能也有args
。