多线程与队列的运用

多线程与队列的运用(多进程,进程池,协程池)

多线程和队列、多进程和队列

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 多线程
from queue import Queue
from threading import Thread
import time

queue = Queue()

def put_data():
for i in range(100):
print("添加数据: {}".format(i))
queue.put_nowait(i)

def get_data():
time.sleep(0.01)
while True:
print("获取数据:{}".format(queue.get()))
queue.task_done()


# 创建线程执行任务
t1 = Thread(target=put_data)
t1.setDaemon(True)
t1.start()

t2 = Thread(target=get_data)
# 把当前线程设置为守护线程
t2.setDaemon(True)
t2.start()

# 让主线线程等待队列的任务完成
queue.join()
print('主线程结束了')



"""
改为多进程:
from queue import Queue
from threading import Thread
修改为
from multiprocessing import JoinableQueue
from multiprocessing import Process
"""
# 补充:多进程任务添加参数,
from multiprocessing import Manager,JoinableQueue,Process

queue = JoinableQueue()

def put_data():
for i in range(100):
print("添加数据: {}".format(i))
queue.put_nowait(i)

def get_data(l):
time.sleep(0.01)
while True:
print("获取数据:{}".format(queue.get()))
l.append(i)
queue.task_done()
with Manager() as manager:
L = manager.list()
p_obj = []
for i in range(30):
p = Process(target=get_data, args=(L,))
p.start()
p_obj.append(p)
for p in p_obj:
p.join()
list1 = list(L)

进程池和队列

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
39
40
"""
改为进程池:
from queue import Queue
from threading import Thread
修改为
from multiprocessing.dummy import Pool
from queue import Queue
"""
from multiprocessing.dummy import Pool
from queue import Queue
import time

queue = Queue()

def put_data():
for i in range(100):
print("添加数据: {}".format(i))
queue.put_nowait(i)

def get_data():
while True:
print("获取数据:{}".format(queue.get()))
time.sleep(0.01)
queue.task_done()

# 创建进程池对象
pool = Pool(3)

# 执行异步任务
pool.apply_async(put_data)
pool.apply_async(get_data)

# pool.close()
# 让主进程等待 进程池中任务完成
# pool.join()

# 让主进程稍微等待下
time.sleep(0.1)
# 等待队列任务的完成
queue.join()

协程池和队列

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
39
40
41
42
43
44
45
46
# 打猴子补丁
from gevent import monkey
monkey.patch_all()

# 导入协程池
from gevent.pool import Pool

"""
总结: 线程池改协程池
1. 把导入进程池, 改为导入协程池
2. 打猴子补丁
3. 初始化方法, 创建协程池可以不指定个数

"""

from queue import Queue
import time

queue = Queue()

def put_data():
for i in range(100):
print("添加数据: {}".format(i))
queue.put_nowait(i)

def get_data():
while True:
print("获取数据:{}".format(queue.get()))
time.sleep(0.01)
queue.task_done()

# 创建协程池对象
pool = Pool()

# 执行异步任务
pool.apply_async(put_data)
pool.apply_async(get_data)

# pool.close()
# 让主线程等待 协程池中任务完成
# pool.join()

# 让主线程稍微等待下
time.sleep(0.1)
# 等待队列任务的完成
queue.join()

待完成:
supervisor使用.md

坚持原创技术分享,您的支持将鼓励我继续创作!