python threading 執行緒原理實驗

Nolca發表於2024-09-01

原理

程序之間,程式語言可以不同,記憶體不共享。需要用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.

相關文章