2017-08-04 52 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),如果沒有逗號,解釋器應該怎麼知道你是否打算使用括號來進行分組或製作一個元組?它含糊不清。