66728
『入門 Python3』を読みながら、JupyterLabを使ってPythonを学んでいます。  
OSはwindows10です。

『10.3.2 multiprocessingによるプロセスの作成』より。

まず、以下のコードが書かれたmp.pyというファイルを作ります。  
これは、Process()関数により、`do_this()`関数を4回実行させるものです。  
見にくくて申し訳ありませんが、インデントは正しく出来ているものとします。

```

    import multiprocessing
    import os
    
    def do_this(what) :
        whoami(what)
    
    def whoami(what) :
        print("Process %s says: %s" % (os.getpid(), what))
    
    if __name__ == "__main__" :
        whoami("I'm the main program")
        for n in range(4) :
            p = multiprocessing.Process(target=do_this, args=("I'm function %s" % n,))
            p.start()
    
```

そして、実行すると以下のような文字が表示されました。

```

    Process 12768 says: I'm the main program
    Process 16372 says: I'm function 1
    Process 2152 says: I'm function 0
    Process 10464 says: I'm function 2
    Process 1280 says: I'm function 3
    
```

さてここで質問です。

  1. なぜ0～3は昇順で表示されないのでしょうか？
  2. if文の `__name__ == "__main__"` についてですが、`"__main__"` とはどこから来た文字列ですか？
  3. if文の `__name__ == "__main__"` についてですが、なぜ `__name__ == "__main__"` を条件文においたのでしょうか？

それでは回答をお願いいたします。

補足：この業界は初心者です。  
言葉や言葉の使い方が正確ではないことがあります。  
この質問文で気になったことがありましたら、何なりとご指摘くださいませ。  
それは、自身の成長のために必要なことだと思っております。
CC BY-SA 4.0
2020-05-17T17:59:04.063
66724
2020-05-19T22:56:05.443
2020-05-19T22:56:05.443
19110
39908
question
python python-multiprocessing
Python の multiprocessing モジュールを使うと出力の順番が変わるのは何故ですか？
おそらくその書籍にも書いてあったのではないかと思いますが、multiprocessing
はマルチプロセスで処理を行うためのライブラリです。複数のプロセスが同時に実行されるため、どのプロセスがより早く文字列を出力できるかは保証されていません。このため実行時の環境によってバラバラな出力順になります。今回は
1 0 2 3 という出力順でしたが、この順番は環境によって変わります。

マルチプロセス自体をどう実現しているかは、OS の教科書をご覧ください。

`if __name__ == "__main__"` は Python
プログラムがスクリプトとして実行されたときを検知するためのイディオムです。モジュールとして読み込まれたときは実行されないが、スクリプトとして起動されたときは実行されるようなプログラムを書くのに使います。事故を防ぐため、なるべく書く方が良いです。

<https://docs.python.org/ja/3/library/__main__.html>
CC BY-SA 4.0
2020-05-17T20:01:43.370
66728
2020-05-17T20:01:43.370
19110
66724
answer