我可以同时在python2 / 3中使用几种不同方法进行多重处理吗

时间:2018-08-16 11:03:01

标签: python subprocess

好吧,我想同时进行两种不同的方法。 我希望通过多处理来完成,但是我发现所有示例都在使用多处理器的情况下使用相同的方法,而不是在使用多处理器的情况下使用不同的方法。 我的代码如下,它按顺序进行,而不是按顺序进行

#-*-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

1 个答案:

答案 0 :(得分:0)

我认为这已经得到了回答,但是我找不到在哪里重复它,我需要的不仅仅是评论来描述正在发生的事情,所以就这样:

代码的问题是实际上您没有在不同的进程中执行功能。相反,您尝试在新进程中执行函数hahahehe的返回值。而且,由于您尚未定义任何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")

我希望这种解释对您有意义,并在以后帮助您注意这些情况。