1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 # Author:woshinidaye
4
5 #线程:执行单位
6 #进程:资源单位,每一个进程至少要有一个线程
7 #下面这个就是单线程,先预定义函数func,然后执行if,遇到func()函数执行,然后在执行主程序里面的打印
8 '''
9 def func():
10 for i in range(10):
11 print('in func', i)
12 if __name__ == '__main__':
13 func()
14 for i in range(10):
15 print('main',i)
16 '''
17
18 #将上述函数变成多线程
19 from threading import Thread #创建线程类
20
21 #方法一
22 '''
23 def func(name):
24 for i in range(9999):
25 print(name, i)
26 if __name__ == '__main__':
27 t1 = Thread(target=func,args=('t1',)) #创建一个线程,并给线程安排任务,大致理解成新雇佣了一个员工来干fun的工作
28 t1.start() #告诉这个员工可以开始干活了
29 t2 = Thread(target=func,args=('t2',))
30 t2.start()
31 for i in range(9999):
32 print('main',i)
33 '''
34
35 #方法二
36 '''
37 class test(Thread): #类
38 def run(self): #t.start执行时就是执行run
39 for n in range(10):
40 print('in the fun',n)
41 if __name__ == '__main__':
42 t = test() #创建一个对象
43 # t.run() #方法的调用,为单线程
44 t.start() #开启多线程
45 for i in range(10):
46 print('in the main',i)
47 '''
48
49
50
51
52 #多进程
53 #方法1
54 from multiprocessing import Process
55 '''
56 def fun():
57 for i in range(10000):
58 print('in the fun',i)
59 if __name__ == '__main__':
60 t = Process(target=fun)
61 t.start()
62 for i in range(10000):
63 print('in the main',i)
64 '''
65 #方法二
66 '''
67 class test(Process):
68 def run(self):
69 for i in range(100000):
70 print('in the func',i)
71 if __name__ == '__main__':
72 t = test()
73 t.start()
74 for i in range(100000):
75 print('in the main',i)
76 '''
77
78
79 #线程池:创建一个线程池,里面有多个线程,用户给线程池提交任务,任务有线程中的某一个线程执行
80 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
81 '''
82 import time
83 def func(name):
84 for i in range(10):
85 print(name,i)
86 time.sleep(1)
87
88 if __name__ == '__main__':
89 with ThreadPoolExecutor(3) as t: #创建线程池
90 for a in range(10):
91 t.submit(func,name=f'线程{a}')
92 #其实上面一段代码就是说:我启动最大worker数为3的线程池,创建了10个任务,然后交给线程池处理,此时表示,这10个任务最大有三个会同时运行
93 print('===done===') #等待线程池中的任务执行完成后,才会执行这一句,(守护!!!)
94 '''
95
96 #爬取北京新发地
97 url = 'http://www.xinfadi.com.cn/getPriceData.html'
98 headers = {
99 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',
100 'Referer': 'http://www.xinfadi.com.cn/priceDetail.html'
101 }
102 # data = {
103 # 'limit': '20',
104 # 'current': 2
105 # }
106 import requests,csv
107 import re
108 from concurrent.futures import ThreadPoolExecutor
109
110 f = open('1207.txt','w+',encoding='utf-8')
111 def down_url(data):
112 resp = requests.post(url=url,headers=headers,data=data)
113 f.writelines(resp.text)
114 print('page',data['current'],'download完成')
115
116 if __name__ == '__main__':
117 with ThreadPoolExecutor(50) as t :
118 for i in range(2,1000):
119 data={
120 'limit': '20',
121 'current': i
122 }
123 t.submit(down_url,data)
124 f.close()
125 print('全部完成')