回答編集履歴

2

誤記

2018/04/11 14:18

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  ```
58
58
 
59
- なお、開始時刻(st)をわざわざサブプロセスへ渡している理由は一応windowsとlinuxでnow()の結果の意味合いを同じにするためです。windowsですとspawnのためグローバル変数stは親プロセスの値がそのまま引き継がれますが、linuxですとfork&execのためかグローバル変数stが子供プロセス開始時に再設定るようです。
59
+ なお、開始時刻(st)をわざわざサブプロセスへ渡している理由は一応windowsとlinuxでnow()の結果の意味合いを同じにするためです。windowsですとspawnのためグローバル変数stは親プロセスの値がそのまま引き継がれますが、linuxですとfork&execのためかグローバル変数stが子供プロセス開始時に再設定されるようです。
60
60
 
61
61
 
62
62
 

1

追記

2018/04/11 14:18

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,3 +1,111 @@
1
+ 追記:
2
+
3
+ コメント欄でのやりとで本回答は質問者さんの課題ではないことがわかりましたので元の回答は取り消します。ついでに書いてしまって申し訳ないのですが、現象をはっきりさせるため次のようなコードにしてみてはいかがでしょうか?目的はinput()が完了した時刻とサブプロセスでprintする直前の時刻がはっきり分かるようにするためです。
4
+
5
+
6
+
7
+ xx.py
8
+
9
+ ```python
10
+
11
+ from multiprocessing import Process
12
+
13
+ import time
14
+
15
+
16
+
17
+ st = time.time()
18
+
19
+
20
+
21
+ def now():
22
+
23
+ return f'{time.time() - st:.2f}'
24
+
25
+
26
+
27
+ def hello(message, st_):
28
+
29
+ global st
30
+
31
+ st = st_
32
+
33
+ time.sleep(2)
34
+
35
+ print(now(), message)
36
+
37
+
38
+
39
+ def work():
40
+
41
+ print(now(), "start")
42
+
43
+ while True:
44
+
45
+ w = input(">> ")
46
+
47
+ print(now(), w)
48
+
49
+ Process(target=hello, args=('nice.'+w, st)).start()
50
+
51
+
52
+
53
+ if __name__ == '__main__':
54
+
55
+ work()
56
+
57
+ ```
58
+
59
+ なお、開始時刻(st)をわざわざサブプロセスへ渡している理由は一応windowsとlinuxでnow()の結果の意味合いを同じにするためです。windowsですとspawnのためグローバル変数stは親プロセスの値がそのまま引き継がれますが、linuxですとfork&execのためかグローバル変数stが子供プロセス開始時に再設定するようです。
60
+
61
+
62
+
63
+ 上記プログラムを`python xx.py`として動かしたときの実行結果は次のようになりました。
64
+
65
+ ```
66
+
67
+ 0.00 start
68
+
69
+ >> a
70
+
71
+ 3.30 a
72
+
73
+ >> b
74
+
75
+ 3.84 b
76
+
77
+ >> c
78
+
79
+ 4.43 c
80
+
81
+ >> 5.41 nice.a
82
+
83
+ 5.94 nice.b
84
+
85
+ 6.54 nice.c
86
+
87
+ d
88
+
89
+ 20.57 d
90
+
91
+ >> e
92
+
93
+ 21.30 e
94
+
95
+ >> 22.67 nice.d
96
+
97
+ 23.41 nice.e
98
+
99
+ ```
100
+
101
+ (Windows10 64bit, cpython 3.6.0, cmd.exeから)
102
+
103
+
104
+
105
+ 元の回答
106
+
107
+ ---
108
+
1
109
  > 上記のプログラムを実行すると下記のようにプロセスが遅れて実行されます。
2
110
 
3
111