
import requests import threading from queue import Queue import time num_xian = input("请输入要执行的线程数:")
threadList = int(num_xian)
workQueue = Queue(10)
threads = [] stare = time.time()
def crawler(threadName, q): # 执行多线程 # 从队列里取出数据 j = q.get(timeout=2) try: print('线程:' + threadName) except Exception as e: print(q.qsize(), threadName, "号线程运行错误 ", e)
class myThread(threading.Thread): def init(self, name, q): threading.Thread.init(self) self.name = name self.q = q def run(self): try: print(self.name + "号线程启动 ") crawler(self.name, self.q) print(self.name + "号线程结束 ") except: print(self.name + "号线程启动失败 ")
for tName in range(1,threadList+1): thread = myThread(tName, workQueue) thread.start() threads.append(thread)
filename = '文件名.txt' f = open(filename, 'r', encoding="utf-8").readlines()
for i in f: workQueue.put(i)
for t in threads: t.join()
end = time.time() print('Queue 多线程批量执行时间为:', end - start)
# coding:utf-8 import requests import threading from queue import Queue import time num_xian = input("请输入要执行的线程数:") # 添加线程 threadList = int(num_xian) # 设置队列长度 workQueue = Queue(10) # 线程池 threads = [] stare = time.time() def crawler(threadName, q): # 执行多线程 # 从队列里取出数据 j = q.get(timeout=2) try: print('线程:' + threadName) except Exception as e: print(q.qsize(), threadName, "号线程运行错误 ", e) class myThread(threading.Thread): def __init__(self, name, q): threading.Thread.__init__(self) self.name = name self.q = q def run(self): try: print(self.name + "号线程启动 ") crawler(self.name, self.q) print(self.name + "号线程结束 ") except: print(self.name + "号线程启动失败 ") # 创建新线程 for tName in range(1,threadList+1): thread = myThread(tName, workQueue) thread.start() threads.append(thread) # 读取数据,放入队列 filename = 'saas_user_mini.txt' f = open(filename, 'r', encoding="utf-8").readlines() for i in f: workQueue.put(i) # 等待所有线程完成 for t in threads: t.join() end = time.time() print('Queue多线程批量执行时间为:', end - start) 1 gefranks 2019-12-16 10:06:18 +08:00 via iPhone 看到排版 实力劝退了 |
2 simenet 2019-12-16 10:45:20 +08:00 看得我老壳痛 |
3 luozic 2019-12-16 12:28:24 +08:00 改一下排版。 |
4 no1xsyzy 2019-12-16 13:13:19 +08:00 这个排版,笑傻了 |
5 as1997121000 OP |
6 RyanOne 2019-12-16 14:50:10 +08:00 排版 劝退 ,晒图 ,或者 gist |
7 as1997121000 OP @RyanOne 重新贴了代码了,不好意思 |
8 cherbim 2019-12-16 16:48:47 +08:00 crawler 里加上最上面加个 while true 啊,你没有在队伍里取东西,就每次创建子线程的时间取一次,然后队伍不取完,子线程无法退出,就一直在那里闲着(正常从队伍取不到东西线程报错然后退出,少了循环), 简单说: 创建第一个子线程,crawler 执行,从队伍取个元素,然后它闲着了... 创建第二个子线程,crawler 执行,从队伍在取个元素,然后它闲着了... 创建第三个子线程,crawler 执行,从队伍再取个元素,然后它闲着了... ... 线程创建完毕,然后一堆线程在那里划水 |
9 helloSpringBoot 2019-12-16 17:04:24 +08:00 2 个问题: 1. 文件行数大于 queue 大小了怎么办? 2. 线程数大于 queue 中数据大小了,后面获取不到数据的线程怎么办? |
10 as1997121000 OP @helloSpringBoot 1.文件行数大于 queue 大小了怎么办? 期望是不管,大于了不读就行了,如果能够实现开多少线程读多少行最好 2. 线程数大于 queue 中数据大小了,后面获取不到数据的线程怎么办? |
11 as1997121000 OP |
12 crackhopper 2019-12-16 17:33:40 +08:00 我测了没问题 开头:stare 改成 start 然后没发现问题了。 |
13 as1997121000 OP @crackhopper 我运行两个线程结果: 1 号线程启动 2 号线程启动 线程:2 线程:1 2 号线程结束 1 号线程结束 ‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’ 然后程序就不走了,在想是不是读取的文件行数比线程数多,线程池一直没释放 |
14 as1997121000 OP |
15 as1997121000 OP |
16 cherbim 2019-12-16 19:34:20 +08:00 |
18 no1xsyzy 2019-12-16 23:52:14 +08:00 1. 没有死循环,结果是开几个线程就是处理几行 2. 没有终止标志,无论是设 Condition 还是给队列喂 Stop Symbol,你得让它可控终止 3. Queue.get 带 timeout 参数却不捕获 Empty 这前置知识缺失问题很重,我甚至不知道从哪开始讲,先看基本模型吧…… 我习惯上来说偏好喂 Stop Symbol https://gist.github.com/no1xsyzy/43c9490250d7efac0f4ba6704d26a72f |
20 as1997121000 OP @as1997121000 我试了下,我的文件有上千条数据,现在是运行后线程是读完了这行就去读了下一行,等到文件读完了才停下 @no1xsyzy 你的代码我试着变成了一个线程读多行并输出然后文件读完了才结束 我把文件传百度云盘了,各位大佬可以参考下 aHR0cHM6Ly9wYW4uYmFpZHUuY29tL3MvMVFUa3lvbjkwYndrOWZoWW1vWGdmMUE= |
21 as1997121000 OP @cherbim @helloSpringBoot @crackhopper 文件我传百度云了,大佬们可以参考下 aHR0cHM6Ly9wYW4uYmFpZHUuY29tL3MvMVFUa3lvbjkwYndrOWZoWW1vWGdmMUE= |
22 as1997121000 OP @no1xsyzy 感谢大佬,我把执行函数的 while True 去了就是我想要的结果了,感谢 |