据说Python多线程是伪多线程,本质上是单线程,经测试,效果确实不好,速度远比不上pthread多线程。
其实,Python本来就比C慢,没法比的。不过Python简单,这点pthread永远比不了。
注:千万不能恶意刷站,否则后果自负,哈哈~~~
import threading
import urllib.error
import urllib.request
TIMES = 10000
URL = "http://bbs.tianya.cn"
class WorkerThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
while True:
WorkerThread.LOCK.acquire()
WorkerThread.COUNT = WorkerThread.COUNT + 1
if WorkerThread.COUNT > WorkerThread.TIMES:
WorkerThread.LOCK.release()
break
print('线程名称:%s\t读取次数:%d' % (self.name, WorkerThread.COUNT))
WorkerThread.LOCK.release()
try:
urllib.request.urlopen(WorkerThread.URL).read()
except (urllib.error.URLError, ConnectionResetError, Exception):
print('线程名称:%s\t读取失败' % (self.name, ))
def thread_demo():
for i in range(100):
WorkerThread("Worker_%02d" % (i, )).start()
if __name__ == '__main__':
WorkerThread.URL = URL
WorkerThread.COUNT = 0
WorkerThread.TIMES = TIMES
WorkerThread.LOCK = threading.RLock()
thread_demo()
运行结果:
"C:\Program Files\Python\python.exe" "D:/Pycharm Projects/PyDemo/ThreadDemo.py"
线程名称:Worker_00 读取次数:1
线程名称:Worker_01 读取次数:2
线程名称:Worker_02 读取次数:3
线程名称:Worker_03 读取次数:4
线程名称:Worker_04 读取次数:5
线程名称:Worker_05 读取次数:6
线程名称:Worker_06 读取次数:7
线程名称:Worker_07 读取次数:8
线程名称:Worker_08 读取次数:9
线程名称:Worker_09 读取次数:10
线程名称:Worker_10 读取次数:11
线程名称:Worker_11 读取次数:12
线程名称:Worker_12 读取次数:13
线程名称:Worker_13 读取次数:14
线程名称:Worker_14 读取次数:15
线程名称:Worker_15 读取次数:16
线程名称:Worker_16 读取次数:17
线程名称:Worker_17 读取次数:18
线程名称:Worker_18 读取次数:19
线程名称:Worker_19 读取次数:20
线程名称:Worker_20 读取次数:21
线程名称:Worker_21 读取次数:22
线程名称:Worker_22 读取次数:23
线程名称:Worker_23 读取次数:24
线程名称:Worker_24 读取次数:25
线程名称:Worker_25 读取次数:26
线程名称:Worker_26 读取次数:27
线程名称:Worker_27 读取次数:28
线程名称:Worker_28 读取次数:29
线程名称:Worker_29 读取次数:30
线程名称:Worker_30 读取次数:31
线程名称:Worker_31 读取次数:32
线程名称:Worker_32 读取次数:33
线程名称:Worker_33 读取次数:34
线程名称:Worker_34 读取次数:35
线程名称:Worker_35 读取次数:36
线程名称:Worker_36 读取次数:37
线程名称:Worker_37 读取次数:38
线程名称:Worker_38 读取次数:39
线程名称:Worker_39 读取次数:40
线程名称:Worker_40 读取次数:41
线程名称:Worker_41 读取次数:42
线程名称:Worker_42 读取次数:43
线程名称:Worker_43 读取次数:44
线程名称:Worker_44 读取次数:45
线程名称:Worker_45 读取次数:46
线程名称:Worker_46 读取次数:47
线程名称:Worker_47 读取次数:48
线程名称:Worker_48 读取次数:49
线程名称:Worker_49 读取次数:50
线程名称:Worker_50 读取次数:51
线程名称:Worker_51 读取次数:52
线程名称:Worker_52 读取次数:53
线程名称:Worker_53 读取次数:54
线程名称:Worker_54 读取次数:55
线程名称:Worker_55 读取次数:56
线程名称:Worker_56 读取次数:57
线程名称:Worker_57 读取次数:58
线程名称:Worker_58 读取次数:59
线程名称:Worker_59 读取次数:60
线程名称:Worker_60 读取次数:61
线程名称:Worker_61 读取次数:62
线程名称:Worker_62 读取次数:63
线程名称:Worker_63 读取次数:64
线程名称:Worker_64 读取次数:65
线程名称:Worker_65 读取次数:66
线程名称:Worker_66 读取次数:67
线程名称:Worker_67 读取次数:68
线程名称:Worker_68 读取次数:69
线程名称:Worker_69 读取次数:70
线程名称:Worker_70 读取次数:71
线程名称:Worker_71 读取次数:72
线程名称:Worker_72 读取次数:73
线程名称:Worker_73 读取次数:74
线程名称:Worker_74 读取次数:75
线程名称:Worker_75 读取次数:76
线程名称:Worker_76 读取次数:77
线程名称:Worker_77 读取次数:78
线程名称:Worker_78 读取次数:79
线程名称:Worker_79 读取次数:80
线程名称:Worker_80 读取次数:81
线程名称:Worker_81 读取次数:82
线程名称:Worker_82 读取次数:83
线程名称:Worker_83 读取次数:84
线程名称:Worker_84 读取次数:85
线程名称:Worker_85 读取次数:86
线程名称:Worker_86 读取次数:87
线程名称:Worker_87 读取次数:88
线程名称:Worker_88 读取次数:89
线程名称:Worker_89 读取次数:90
线程名称:Worker_90 读取次数:91
线程名称:Worker_91 读取次数:92
线程名称:Worker_92 读取次数:93
线程名称:Worker_93 读取次数:94
线程名称:Worker_94 读取次数:95
线程名称:Worker_95 读取次数:96
线程名称:Worker_96 读取次数:97
线程名称:Worker_97 读取次数:98
线程名称:Worker_98 读取次数:99
线程名称:Worker_99 读取次数:100
线程名称:Worker_13 读取次数:101
线程名称:Worker_17 读取次数:102
线程名称:Worker_06 读取次数:103
线程名称:Worker_75 读取次数:104
线程名称:Worker_59 读取次数:105
线程名称:Worker_09 读取次数:106
线程名称:Worker_30 读取次数:107
线程名称:Worker_83 读取次数:108
线程名称:Worker_32 读取次数:109
线程名称:Worker_48 读取次数:110
线程名称:Worker_33 读取次数:111
线程名称:Worker_90 读取次数:112
线程名称:Worker_38 读取次数:113
线程名称:Worker_45 读取次数:114
线程名称:Worker_40 读取次数:115
线程名称:Worker_52 读取次数:116
线程名称:Worker_03 读取次数:117
线程名称:Worker_87 读取次数:118
线程名称:Worker_19 读取次数:119
线程名称:Worker_89 读取次数:120
线程名称:Worker_56 读取次数:121
线程名称:Worker_64 读取次数:122
线程名称:Worker_31 读取次数:123
线程名称:Worker_24 读取次数:124
线程名称:Worker_96 读取次数:125
线程名称:Worker_00 读取次数:126
线程名称:Worker_43 读取次数:127
线程名称:Worker_93 读取次数:128
线程名称:Worker_20 读取次数:129
线程名称:Worker_53 读取次数:130
线程名称:Worker_46 读取次数:131
线程名称:Worker_97 读取次数:132
线程名称:Worker_35 读取次数:133
线程名称:Worker_16 读取次数:134
线程名称:Worker_36 读取次数:135
线程名称:Worker_58 读取次数:136
线程名称:Worker_05 读取次数:137
线程名称:Worker_76 读取次数:138
线程名称:Worker_85 读取次数:139
线程名称:Worker_47 读取次数:140
线程名称:Worker_59 读取次数:141
线程名称:Worker_37 读取次数:142
线程名称:Worker_68 读取次数:143
线程名称:Worker_51 读取次数:144
线程名称:Worker_91 读取次数:145
线程名称:Worker_63 读取次数:146
线程名称:Worker_71 读取次数:147
线程名称:Worker_90 读取次数:148
线程名称:Worker_33 读取次数:149
线程名称:Worker_80 读取次数:150
线程名称:Worker_50 读取次数:151
线程名称:Worker_57 读取次数:152
线程名称:Worker_48 读取次数:153
线程名称:Worker_26 读取次数:154
线程名称:Worker_32 读取次数:155
线程名称:Worker_83 读取次数:156
线程名称:Worker_29 读取次数:157
线程名称:Worker_72 读取次数:158
线程名称:Worker_41 读取次数:159
线程名称:Worker_34 读取次数:160
线程名称:Worker_55 读取次数:161
线程名称:Worker_66 读取次数:162
线程名称:Worker_70 读取次数:163
线程名称:Worker_28 读取次数:164
线程名称:Worker_11 读取次数:165
线程名称:Worker_12 读取次数:166
线程名称:Worker_89 读取次数:167
线程名称:Worker_40 读取次数:168
线程名称:Worker_54 读取次数:169
线程名称:Worker_02 读取次数:170
线程名称:Worker_13 读取次数:171
线程名称:Worker_99 读取次数:172
线程名称:Worker_06 读取次数:173
线程名称:Worker_94 读取次数:174
线程名称:Worker_82 读取次数:175
线程名称:Worker_61 读取次数:176
线程名称:Worker_27 读取次数:177
线程名称:Worker_78 读取次数:178
线程名称:Worker_62 读取次数:179
线程名称:Worker_92 读取次数:180
线程名称:Worker_21 读取次数:181
线程名称:Worker_81 读取次数:182
线程名称:Worker_25 读取次数:183
线程名称:Worker_15 读取次数:184
线程名称:Worker_79 读取次数:185
线程名称:Worker_18 读取次数:186
线程名称:Worker_75 读取次数:187
线程名称:Worker_60 读取次数:188
线程名称:Worker_88 读取次数:189
线程名称:Worker_46 读取次数:190
线程名称:Worker_69 读取次数:191
线程名称:Worker_09 读取次数:192
线程名称:Worker_67 读取次数:193
线程名称:Worker_43 读取次数:194
线程名称:Worker_98 读取次数:195
线程名称:Worker_30 读取次数:196
线程名称:Worker_10 读取次数:197
线程名称:Worker_45 读取次数:198
线程名称:Worker_93 读取次数:199
线程名称:Worker_44 读取次数:200
线程名称:Worker_95 读取次数:201
线程名称:Worker_49 读取次数:202
线程名称:Worker_20 读取次数:203
线程名称:Worker_74 读取次数:204
线程名称:Worker_17 读取次数:205
线程名称:Worker_38 读取次数:206
线程名称:Worker_77 读取次数:207
线程名称:Worker_65 读取次数:208
线程名称:Worker_01 读取次数:209
线程名称:Worker_31 读取次数:210
线程名称:Worker_73 读取次数:211
线程名称:Worker_96 读取次数:212
线程名称:Worker_87 读取次数:213
线程名称:Worker_03 读取次数:214
线程名称:Worker_52 读取次数:215
线程名称:Worker_19 读取次数:216
线程名称:Worker_14 读取次数:217
线程名称:Worker_86 读取次数:218
线程名称:Worker_64 读取次数:219
线程名称:Worker_24 读取次数:220
线程名称:Worker_56 读取次数:221
线程名称:Worker_00 读取次数:222
线程名称:Worker_23 读取次数:223
线程名称:Worker_53 读取次数:224
线程名称:Worker_39 读取次数:225
线程名称:Worker_84 读取次数:226
线程名称:Worker_04 读取次数:227
线程名称:Worker_22 读取次数:228
线程名称:Worker_66 读取次数:229
线程名称:Worker_16 读取次数:230
线程名称:Worker_40 读取次数:231
线程名称:Worker_14 读取次数:232
线程名称:Worker_87 读取次数:233
线程名称:Worker_63 读取次数:234
线程名称:Worker_81 读取次数:235
线程名称:Worker_56 读取次数:236
线程名称:Worker_23 读取次数:237
线程名称:Worker_02 读取次数:238
线程名称:Worker_52 读取次数:239
线程名称:Worker_65 读取次数:240
线程名称:Worker_30 读取次数:241
线程名称:Worker_73 读取次数:242
线程名称:Worker_95 读取次数:243
线程名称:Worker_62 读取次数:244
线程名称:Worker_01 读取次数:245
线程名称:Worker_83 读取次数:246
线程名称:Worker_06 读取次数:247
线程名称:Worker_46 读取次数:248
线程名称:Worker_09 读取次数:249
线程名称:Worker_45 读取次数:250
线程名称:Worker_70 读取次数:251
线程名称:Worker_26 读取次数:252
线程名称:Worker_54 读取次数:253
线程名称:Worker_60 读取次数:254
线程名称:Worker_51 读取次数:255
线程名称:Worker_20 读取次数:256
线程名称:Worker_25 读取次数:257
线程名称:Worker_03 读取次数:258
线程名称:Worker_68 读取次数:259
线程名称:Worker_58 读取次数:260
线程名称:Worker_47 读取次数:261
线程名称:Worker_13 读取次数:262
线程名称:Worker_17 读取次数:263
线程名称:Worker_16 读取次数:264
线程名称:Worker_41 读取次数:265
线程名称:Worker_40 读取次数:266
线程名称:Worker_59 读取次数:267
线程名称:Worker_23 读取次数:268
线程名称:Worker_35 读取次数:269
线程名称:Worker_69 读取次数:270
线程名称:Worker_48 读取次数:271
线程名称:Worker_56 读取次数:272
线程名称:Worker_63 读取次数:273
线程名称:Worker_29 读取次数:274
线程名称:Worker_57 读取次数:275
线程名称:Worker_02 读取次数:276
线程名称:Worker_05 读取次数:277
线程名称:Worker_06 读取次数:278
线程名称:Worker_38 读取次数:279
线程名称:Worker_92 读取次数:280
线程名称:Worker_80 读取次数:281
线程名称:Worker_45 读取次数:282
线程名称:Worker_18 读取次数:283
线程名称:Worker_98 读取次数:284
线程名称:Worker_39 读取次数:285
Process finished with exit code -1