2017-08-04 60 views
0

比方说,我测试了下面的代码,看看子进程池的行为:困惑关于蟒蛇位置参数,像ARGS =(我)

# coding=utf-8 
import os 
import sys 
from multiprocessing import Pool 
import time 
import random 
def run_proc(param1): 
    print("child procees %s pid is %s,parent id is %s" % 
      (param1, os.getpid(), os.getppid())) 
    starttime = time.time() 
    time.sleep(random.random() * 3) 
    endtime = time.time() 
    print('child process %s runs %0.2f seconds.' % 
      (param1, (endtime - starttime))) 

if __name__ == '__main__': 
    print(sys.version) 
    pname = sys.argv[0].split('/')[-1] 
    print("process %s is running now...,it's pid is %s" % (pname, os.getpid())) 
    p = Pool(5) 
    for i in range(5): 
     p.apply_async(run_proc, args=("test"+str(i),)) 
    print("waiting for all subprocess to end...") 
    p.close() 
    p.join() 
    print("all subprocesses are over!") 

并且输出是所有我所料:

3.5.0 (default, Jul 23 2017, 10:55:33) 
    [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] 
    process mp_basic_pool.py is running now...,it's pid is 19352 
    waiting for all subprocess to end... 
    child procees test0 pid is 19367,parent id is 19352 
    child procees test1 pid is 19368,parent id is 19352 
    child procees test2 pid is 19369,parent id is 19352 
    child procees test3 pid is 19370,parent id is 19352 
    child procees test4 pid is 19371,parent id is 19352 
    child process test2 runs 0.93 seconds. 
    child process test4 runs 1.33 seconds. 
    child process test3 runs 1.68 seconds. 
    child process test0 runs 2.68 seconds. 
    child process test1 runs 2.90 seconds. 
    all subprocesses are over! 
    [Finished in 3.2s] 

有线"p.apply_async(run_proc, args=("test"+str(i),))"。当我第一次写这段代码时,我把它写成:"p.apply_async(run_proc, args=("test"+str(i)))"。逗号离开,但产量为:

3.5.0 (default, Jul 23 2017, 10:55:33) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] 
process mp_basic_pool.py is running now...,it's pid is 19382 
waiting for all subprocess to end... 
all subprocesses are over! 
[Finished in 0.4s] 

我找了蟒蛇的文件,发现第二个参数应该是一个元组,但是需要逗号?

+0

是的,其实你读得对。你需要一个元组,而'(something)'不是一个元组,它只是'something'。在另一种情况下,'(something,)'是一个只由一个元素组成的元组:'something'。 – iFlo

+1

好吧,我现在3Q得到证实,就像@Carcigenicate说的那样,对于翻译来说是不明确的 – XpreZ

回答

1

单元素元组(("test"+str(i),))需要尾随逗号来区分它们和一对括号。

想想这样:对于(x),如果没有逗号,解释器应该怎么知道你是否打算使用括号来进行分组或制作一个元组?它含糊不清。