进程线程

每一个程序的执行,都至少要包含一个进程;一个进程里面至少要包含一个线程

  • 多进程,并发的

以下程序有四个进程,四个线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   from multiprocessing import Process
import time

def tell_me_your_name(name):
print('start:', name)
time.sleep(2)
print('end:', name)

#主进程
if __name__ == '__main__':
start_time = time.time()
# 1. 需要生成一个类,多线程的类/多进程的类
# 在下面我们生成的这个进程里面, 本身就有一个线程,以下有三个进程
p1 = Process(target=tell_me_your_name, args=('caicaicai',))
p2 = Process(target=tell_me_your_name, args=('zizizi',))
p3 = Process(target=tell_me_your_name, args=('ningningning',))

# 2. 启动进程
p1.start()
p2.start()
p3.start()

# 3. 等待进程结束
p1.join()
p2.join()
p3.join()

print(time.time() - start_time)
# 返回的接过有三个print('start:', name)一起输出,然后2秒后三个print('end:', name)一起输出,最后得到时间间距2.357...秒
  • 多线程,并发的

新建线程的时间比新建进程的时间短,并发时,切换的速度比进程快

以下程序有1个进程,四个线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import threading
import time

def tell_me_your_name(name):
print('start:', name)
time.sleep(2)
print('end:', name)

if __name__ == '__main__':
start_time = time.time()
# 1. 生成一个类, 多线程的类
t1 = threading.Thread(target=tell_me_your_name, args=('xiaoxiao',))
t2 = threading.Thread(target=tell_me_your_name, args=('xingxing',))
t3 = threading.Thread(target=tell_me_your_name, args=('jiajia',))
# 2, 启动这个多线程
t1.start()
t2.start()
t3.start()
# 3. 等待这个多线程的结束
t1.join()
t2.join()
t3.join()

print(time.time()-start_time)

进程池

每一个任务一个进程,100个任务的情况下,限制进程的数量.如果我们的任务更多,10000个,频繁的创建进程和销毁进程,也会造成性能损失,所以引入进程池的概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import time
from multiprocessing import Pool

def tell_me_your_name(name):
print('start:', name)
time.sleep(2)
print('end:', name)

if __name__ == '__main__':
start_time = time.time()
# 用法,
# 生成一个进程池类
pool = Pool(processes=3)
names = ['xiaoxiao', 'tongtong', 'ningning', 'chongchong']
# 获取进程执行任务
for name in names:
print(name)
pool.apply_async(func=tell_me_your_name, args=(name,))

# 进程池中的信息传递怎么办 Manager().Queue
# 进程池中的返回值怎么办 res.get

# 用完pool进程池之后,我们需要将进程池进行关闭
# 关闭后,需要等待所有的进程执行结束
pool.close()
pool.join()
print(time.time() - start_time)
# 返回的信息为三个print('start:', name),第一个start输出'end:'关闭,第四个输出'start:',接下来三个关闭,最后输出时间差

协程

  1. 不需要多启动进程或者线程

  2. 进程和线程的切换回比较耗时

  3. 协程不需要cpu的切换功能

  4. yield的实现方式,如: yield XXX 或 xxx = yield / send

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import gevent
from gevent import monkey
import time
import requests
# 猴子补丁, ?
monkey.patch_all()

def tell_me_your_name(name):
print('start:', name)
#time.sleep(2)
response = requests.get('http://www.baidu.com', verify=False)
print('end:', name)
#
# def tell_me_your_name(name):
# print('start:', name)
# #time.sleep(2)
# response = requests.get('http://www.xicidaili.com', verify=False)
# print('end:', name)
#
# def tell_me_your_name(name):
# print('start:', name)
# #time.sleep(2)
# response = requests.get('http://www.python.org', verify=False)
# print('end:', name)
#
# def tell_me_your_name(name):
# print('start:', name)
# #time.sleep(2)
# response = requests.get('http://www.douyu.com', verify=False)
# print('end:', name)

if __name__ == '__main__':
g1 = gevent.spawn(tell_me_your_name, 'adam')
g2 = gevent.spawn(tell_me_your_name, 'eva')
g3 = gevent.spawn(tell_me_your_name, 'bob')
g4 = gevent.spawn(tell_me_your_name, 'alice')
gevent.joinall([g1, g2, g3, g4])
# 一起输出四个"start",然后一起输出四个"end"

代理

代理相关的网站: 1. 66ip.cn, 2. data5u.com, 3. xicidaili.com, 4. goubanjia.com, 5. xdaili.cn, 6. kuaidaili.com, 7. cn-proxy.com, 8. proxy-list.org66ip.cn, 9. data5u.com, 10. xicidaili.com, 11. goubanjia.com, 12. xdaili.cn, 13. kuaidaili.com, 14. cn-proxy.com, 15. proxy-list.org

1
2
3
4
5
6
7
8
9
10
11
12
import requests

proxy = '59.57.148.221'
proxies = {
'http': 'http://' + proxy+':9999',
'https': 'https://' + proxy+':9999'
}
try:
res = requests.get('http://httpbin.org/get', proxies=proxies)
print(res.text)
except requests.exceptions.ConnectionError as e:
print('error', e.args)
1
2
3
4
5
6
7
from selenium import webdriver

proxy = '59.57.148.221'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy+":9999")
browser = webdriver.Chrome(chrome_options=chrome_options)
res = browser.get('https://www.baidu.com/s?wd=ip')