

Pythonでスレッドを用いて一括で全パッケージのアップデートをしたいと思っています。  
しかし、下記のコードは[GoルーチンやPythonでマルチスレッドで実行した時](https://ja.stackoverflow.com/questions/7441/golang%E3%81%A7python%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)のように早くなりません。なぜ、遅くなってしまうのでしょうか?

[code]

        
    #!/usr/local/bin/python3.4
    import subprocess
    import os
    import threading
    import re
    
    
    def update(package_name):
        os.system("pip3.4 install " + package_name + " -U")
    
    s = subprocess.check_output(["pip3.4", "freeze"]).decode()
    package_list = re.findall(".+(?===)", s)
    package_list.extend(["pip", "setuptools"])
    print(package_list)
    
    for v in package_list:
        threading.Thread(target=update, args=(v,)).start()
    
        
    
[/code]


CC BY-SA 3.0
2015-03-06T05:31:01.233
7532
2015-03-06T14:02:35.397
2017-04-13T12:52:39.113
-1
5246
question
python
Pythonのパッケージを一括でアップデートするプログラムをマルチスレッドで書く


これは回答ではないのですが、Python の GIL について、例えば以下のコードを実行すると、

[code]

    from threading import Thread
    import os
    
    def sleep(n):
      os.system("date; echo " + str(n) + "; sleep 1")
    
    for n in range(0,10):
      Thread(target=sleep, args=(n,)).start()
    
[/code]

結果は以下の様になります。

[code]

    Fri Mar  6 22:30:35 JST 2015
    0
    Fri Mar  6 22:30:35 JST 2015
    1
    Fri Mar  6 22:30:35 JST 2015
    Fri Mar  6 22:30:35 JST 2015
    3
    4
    Fri Mar  6 22:30:35 JST 2015
    Fri Mar  6 22:30:35 JST 2015
    5
    2
    Fri Mar  6 22:30:35 JST 2015
    7
    Fri Mar  6 22:30:35 JST 2015
    8
    Fri Mar  6 22:30:35 JST 2015
    6
    Fri Mar  6 22:30:35 JST 2015
    9
    
[/code]

どうやら、`os.system()` の実行時には GIL が外される様です。

[Message 103280 - Python tracker](http://bugs.python.org/msg103280)

> It locks the buffer because os.system() releases the GIL when calling
> system().


CC BY-SA 3.0
2015-03-06T13:39:17.923
7557
2015-03-06T13:39:17.923
7532
answer