原理
程序之間,程式語言可以不同,記憶體不共享。需要用socket/IRC/RPC等技術實現程序間通訊
執行緒之間,程式語言必須相同,記憶體共享。類變數self.xxx
共享,分叉target的函式內變數private
不共享。
現象
fork自己的fork,fork內的程式碼執行速度呈指數型增長。
程式碼
#! /usr/bin/env -S conda run --live-stream -n base python
import threading as th
import time
gap_sec = 0.1
max_lines = 300
class MyThread:
def __init__(self, public):
self.count = 1
self.pub = public
self.threads = []
def fork(self, private):
pid = th.get_ident()
self.threads.append(pid)
pidx = self.threads.index(pid)
while self.count < max_lines:
# report first
print(f'({self.count})\t{pidx}.\tpri={private}\tpub={self.pub} ')
self.count += 1
# then fork
t = th.Thread(target=self.fork, args=(private+1,))
time.sleep(gap_sec*0.7*private) # 用質數,搶佔列印機率減小
try:
t.start()
except RuntimeError:
break
self.threads.append(t.ident)
print(f'({self.count})\tfork: {pidx}. > {self.threads.index(t.ident)}. ') # {self.threads}
self.count += 1
self.pub += 1
time.sleep(gap_sec*1.1)
thread = MyThread(0)
thread.fork(0)
執行結果
(1) 0. pri=0 pub=0
(2) fork: 0. > 1.
(3) 1. pri=1 pub=1
(4) fork: 1. > 3.
(5) 3. pri=2 pub=2
(6) 0. pri=0 pub=2
(7) fork: 0. > 5.
(8) 5. pri=1 pub=3
(9) 1. pri=1 pub=3
(10) fork: 5. > 7.
(10) 7. pri=2 pub=3
(12) fork: 3. > 9. (12) 9. pri=3 pub=4
(14) 0. pri=0 pub=5
(15) fork: 0. > 11.
(16) 11. pri=1 pub=6
(17) fork: 1. > 13. (17) 13. pri=2 pub=6
(19) 5. pri=1 pub=7
(20) fork: 11. > 15.
(21) 15. pri=2 pub=8
(22) fork: 7. > 17. (22) 17. pri=3 pub=8
(24) 3. pri=2 pub=9
(25) 0. pri=0 pub=9
(26) 19. pri=1 pub=9
(27) fork: 0. > 19.
(28) 1. pri=1 pub=10
(29) fork: 5. > 21.
(30) 21. pri=2 pub=11
(31) fork: 13. > 23.
(32) 23. pri=3 pub=12
(33) 11. pri=1 pub=12
(34) fork: 19. > 25.
(35) 25. pri=2 pub=13
(36) 27. pri=4 pub=13
(37) fork: 9. > 27.
(38) 7. pri=2 pub=14
(39) fork: 1. > 29.
(40) fork: 15. > 30.
(41) 29. pri=2 pub=16
(41) 30. pri=3 pub=16
(43) 0. pri=0 pub=16
(44) 33. pri=1 pub=16
(45) fork: 0. > 33.
(46) fork: 3. > 35.
(47) 35. pri=3 pub=18
(48) 5. pri=1 pub=18
(49) fork: 11. > 37.
(50) 37. pri=2 pub=19
(51) 13. pri=2 pub=19
(52) fork: 21. > 39.
(53) 39. pri=3 pub=20
(54) 19. pri=1 pub=20
(55) fork: 33. > 41.
(55) 41. pri=2 pub=20
(57) fork: 17. > 43.
(58) 43. pri=4 pub=22
(59) 9. pri=3 pub=22
(60) 15. pri=2 pub=22
(60) 1. pri=1 pub=22
(62) 45. pri=3 pub=22
(62) fork: 5. > 46.
(64) 46. pri=2 pub=23 (64) fork: 25. > 45.
(66) 0. pri=0 pub=24
(67) 49. pri=1 pub=24
(68) fork: 0. > 49.
(69) 3. pri=2 pub=25 (69) fork: 7. > 51.
(69) 51. pri=3 pub=25
(72) fork: 29. > 53.
(73) 53. pri=3 pub=27
(74) 11. pri=1 pub=27
(75) fork: 19. > 55.
(76) 55. pri=2 pub=28
(77) fork: 23. > 57.
(77) 57. pri=4 pub=28
(79) 21. pri=2 pub=29
(80) fork: 37. > 59.
(80) 59. pri=3 pub=29
(82) fork: 1. > 61.
(82) 61. pri=2 pub=30
(84) 33. pri=1 pub=31
(85) fork: 49. > 63.
(86) 63. pri=2 pub=32
(87) fork: 13. > 65. (87) 17. pri=3 pub=32
(88) 65. pri=3 pub=32
(90) fork: 30. > 67.
(90) 67. pri=4 pub=33
(92) 5. pri=1 pub=34
(93) 25. pri=2 pub=34
(93) fork: 11. > 69.
(95) 70. pri=3 pub=35
(96) fork: 41. > 70.
(97) 69. pri=2 pub=36
(98) 0. pri=0 pub=36
(99) 73. pri=1 pub=36
(100) fork: 0. > 73.
(101) fork: 35. > 75.
(102) 75. pri=4 pub=38
(103) 7. pri=2 pub=38
(104) 29. pri=2 pub=38
(105) fork: 15. > 77.
(106) 77. pri=3 pub=39
(107) fork: 46. > 79.
(108) 79. pri=3 pub=40
(109) 19. pri=1 pub=40
(110) fork: 33. > 81.
(111) 81. pri=2 pub=41
(112) fork: 27. > 83.
(113) 83. pri=5 pub=42
(114) 23. pri=3 pub=42
(115) fork: 39. > 85.
(116) 85. pri=4 pub=43
(117) fork: 3. > 87.
(118) 87. pri=3 pub=44
(119) 37. pri=2 pub=44
(119) 89. pri=3 pub=44
(119) 1. pri=1 pub=44 (119) fork: 55. > 89.
(123) fork: 5. > 91.
(124) 91. pri=2 pub=46
(125) fork: 73. > 93. (125) 49. pri=1 pub=46
(127) 93. pri=2 pub=47
(128) fork: 9. > 95.
(129) 95. pri=4 pub=48
(130) 13. pri=2 pub=48
(131) 30. pri=3 pub=48
(132) fork: 21. > 97.
(133) 97. pri=3 pub=49
(134) 99. pri=4 pub=49 (134) fork: 45. > 99.
(136) fork: 61. > 101.
(137) 101. pri=3 pub=51
(138) fork: 19. > 103.
(139) 103. pri=2 pub=52
(140) 11. pri=1 pub=52
(141) 41. pri=2 pub=52
(142) fork: 63. > 105.
(143) 105. pri=3 pub=53
(144) 0. pri=0 pub=53
(145) fork: 0. > 107.
(146) 107. pri=1 pub=54
(147) 109. pri=4 pub=54
(148) 35. pri=3 pub=54
(149) fork: 51. > 109.
(150) 111. pri=4 pub=55
(151) fork: 53. > 111.
(152) fork: 1. > 113. (152) 15. pri=2 pub=56
(153) 113. pri=2 pub=56
(154) 115. pri=3 pub=56
(155) fork: 25. > 115. (155) 117. pri=3 pub=56
(156) 46. pri=2 pub=56
(157) fork: 69. > 117.
(160) 33. pri=1 pub=59
(161) fork: 49. > 119. (161) 119. pri=2 pub=59
(163) fork: 43. > 121.
(163) 121. pri=5 pub=60
(165) 27. pri=4 pub=61
(166) 39. pri=3 pub=61
(167) fork: 59. > 123.
(167) 3. pri=2 pub=61
(168) 123. pri=4 pub=61
(169) fork: 7. > 125.
(170) 125. pri=3 pub=62
(172) fork: 29. > 127.
(173) 127. pri=3 pub=64
(174) 55. pri=2 pub=64
(175) 5. pri=1 pub=64
(176) fork: 11. > 129.
(177) 129. pri=2 pub=65
(178) fork: 81. > 131.
(179) 131. pri=3 pub=66
(180) 73. pri=1 pub=66
(181) 133. pri=2 pub=66
(182) fork: 107. > 133.
(183) 135. pri=4 pub=67 (183) fork: 17. > 135.
(183) 9. pri=3 pub=67
(186) fork: 65. > 137.
(187) 137. pri=4 pub=69
(188) 21. pri=2 pub=69
(189) 45. pri=3 pub=69
(190) 61. pri=2 pub=69
(191) fork: 70. > 139.
(192) fork: 37. > 140.
(193) 139. pri=4 pub=71
(193) 140. pri=3 pub=71
(194) fork: 91. > 143.
(196) 143. pri=3 pub=72
(197) 19. pri=1 pub=72
(198) 63. pri=2 pub=72
(199) 145. pri=3 pub=72
(199) fork: 33. > 146.
(200) 146. pri=2 pub=73
(201) fork: 93. > 145.
(203) 149. pri=5 pub=74
(204) fork: 57. > 149.
(205) 0. pri=0 pub=75
(206) fork: 0. > 151.
(207) 151. pri=1 pub=76
(208) fork: 13. > 153.
(209) 153. pri=3 pub=77
(210) 51. pri=3 pub=77
(211) 53. pri=3 pub=77
(212) fork: 77. > 155.
(213) 155. pri=4 pub=78
(214) fork: 79. > 157.
(215) 157. pri=4 pub=79
(216) fork: 103. > 159. (216) 159. pri=3 pub=79
(218) fork: 41. > 161.
(219) fork: 5. > 162.
(220) 161. pri=3 pub=82 (220) 162. pri=2 pub=82
(222) 69. pri=2 pub=82
(223) 1. pri=1 pub=82
(224) 25. pri=2 pub=82
(225) fork: 73. > 165.
(225) 165. pri=2 pub=82
(227) 49. pri=1 pub=83
(228) 43. pri=4 pub=83
(229) fork: 23. > 167.
(230) 167. pri=4 pub=84
(231) fork: 67. > 169.
(232) 169. pri=5 pub=85
(233) fork: 87. > 171.
(234) 171. pri=4 pub=86
(235) fork: 89. > 173.
(236) 173. pri=4 pub=87
(237) 7. pri=2 pub=87
(238) 59. pri=3 pub=87
(239) 29. pri=2 pub=87
(240) 175. pri=3 pub=87
(241) fork: 113. > 175.
(242) fork: 15. > 177.
(242) fork: 46. > 178.
(243) 177. pri=3 pub=89
(244) 178. pri=3 pub=89
(246) fork: 19. > 181.
(247) 181. pri=2 pub=91
(248) 11. pri=1 pub=91
(249) 81. pri=2 pub=91
(250) fork: 119. > 183.
(251) 183. pri=3 pub=92
(252) fork: 75. > 185.
(253) 185. pri=5 pub=93
(254) 107. pri=1 pub=93
(255) fork: 151. > 187.
(256) 187. pri=2 pub=94
(257) 17. pri=3 pub=94
(258) 65. pri=3 pub=94 (258) fork: 30. > 189.
(259) 189. pri=4 pub=95
(261) fork: 97. > 191.
(262) 191. pri=4 pub=96
(263) fork: 3. > 193. (263) 193. pri=3 pub=96
(265) fork: 101. > 195.
(266) 195. pri=4 pub=98
(267) fork: 55. > 197. (267) 197. pri=3 pub=98 (267) 70. pri=3 pub=98
(270) 37. pri=2 pub=99 (270) fork: 129. > 199.
(272) 91. pri=2 pub=100
(272) 200. pri=4 pub=100
(272) 199. pri=3 pub=100
(275) fork: 105. > 200.
(276) fork: 1. > 203.
(277) 203. pri=2 pub=102
(278) 205. pri=3 pub=102 (278) fork: 133. > 205.
(280) 93. pri=2 pub=103
(281) 33. pri=1 pub=103
(281) 207. pri=2 pub=103
(283) fork: 49. > 207.
(284) 57. pri=4 pub=104
(285) 209. pri=4 pub=104
(286) 210. pri=5 pub=104
(286) fork: 35. > 209.
(287) fork: 85. > 210.
(289) 0. pri=0 pub=106
(290) 213. pri=1 pub=106
(291) fork: 0. > 213.
(292) 13. pri=2 pub=107
(293) 215. pri=3 pub=107
(294) fork: 21. > 215.
(295) 77. pri=3 pub=108
(296) 79. pri=3 pub=108
(297) fork: 61. > 217.
(298) 217. pri=3 pub=109
(299) 219. pri=4 pub=109
(300) fork: 117. > 219.
(301) fork: 115. > 221.
(302) fork: 11. > 221.
(303) fork: 63. > 221.
(304) fork: 146. > 221.
(305) fork: 95. > 221.
(306) fork: 107. > 73.
(307) fork: 39. > 67.
(308) fork: 125. > 87.
(309) fork: 127. > 67.
(310) fork: 99. > 23.
(311) fork: 131. > 89.
(312) fork: 69. > 87.
(313) fork: 25. > 89.
(314) fork: 162. > 67.
(315) fork: 83. > 67.
(316) fork: 165. > 19.
(317) fork: 33. > 119.
(318) fork: 9. > 119.
(319) fork: 109. > 19.
(319) fork: 111. > 75.
(321) fork: 213. > 75.
(322) fork: 45. > 30.
(322) fork: 29. > 75.
(324) fork: 140. > 101.
(324) fork: 7. > 151.
(326) fork: 143. > 75.
(327) fork: 181. > 75.
(328) fork: 81. > 75.
(329) fork: 145. > 129.
(330) fork: 27. > 1.
(331) fork: 187. > 133.
(332) fork: 153. > 49.
(333) fork: 51. > 49.
(334) fork: 123. > 1.
(335) fork: 53. > 133.