python threading 线程原理实验
原理
进程之间,编程语言可以不同,内存不共享。需要用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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步