好吧,我想同时进行两种不同的方法。 我希望通过多处理来完成,但是我发现所有示例都在使用多处理器的情况下使用相同的方法,而不是在使用多处理器的情况下使用不同的方法。 我的代码如下,它按顺序进行,而不是按顺序进行
#-*-coding:utf-8-*-
import multiprocessing
import time
#def thread_test(num1,num2):
#x=5
def haha(num1):
for i in range(num1):
time.sleep(1)
print('a')
def hehe(num2):
for i in range(num2):
time.sleep(1)
print('b')
if __name__=='__main__':
pool = multiprocessing.Pool(processes=4)
pool.apply_async(haha(5))
pool.apply_async(hehe(5))
pool.close()
pool.join()
print("done")
打印如下
a
a
a
a
a
b
b
b
b
b
done
答案 0 :(得分:0)
我认为这已经得到了回答,但是我找不到在哪里重复它,我需要的不仅仅是评论来描述正在发生的事情,所以就这样:
代码的问题是实际上您没有在不同的进程中执行功能。相反,您尝试在新进程中执行函数haha
和hehe
的返回值。而且,由于您尚未定义任何return
值,因此它们将返回None
。
.apply_async
(以及类似的函数)需要以裸函数名称作为第一个参数,然后以参数作为第二个参数(包装为tuple
)来调用。由于Python(以及几乎所有其他编程语言)定义了执行顺序,因此需要执行该命令,在该顺序中,函数argumnets在函数本身之前进行评估。因此,当您调用一个带有另一个函数 call 的参数的函数时,内部函数调用将首先被求值。
因此,解决方案是调用外部函数,而不是内部函数调用,而是使用裸函数名称(然后将其用作内部函数的引用),然后将内部函数的参数命名为外部函数的单独参数。这样,在外部函数开始执行之前,就没有任何需要评估的提示。对于当前情况,解决方案因此很简单。只需将代码更改为:
#-*-coding:utf-8-*-
import multiprocessing
import time
def haha(num1):
for i in range(num1):
time.sleep(1)
print('a')
def hehe(num2):
for i in range(num2):
time.sleep(1)
print('b')
if __name__=='__main__':
pool = multiprocessing.Pool(processes=4)
pool.apply_async(haha, (5,)) # instead of pool.apply_async(haha(5))
pool.apply_async(hehe, (5,)) # instead of pool.apply_async(hehe(5))
pool.close()
pool.join()
print("done")
我希望这种解释对您有意义,并在以后帮助您注意这些情况。