Queue模块中提供了同步的,线程安全的队列类,包括:
这些都实现了 锁原语,能够在多线程中直接使用
from queue import Queue, LifoQueue, PriorityQueue
from queue import Queue
q1 = Queue(maxsize=5) # If maxsize is <= 0, the queue size is infinite.
# 往队列中添加元素
q1.put(1)
q1.put(2)
q1.put(3)
q1.put(4)
q1.put(5)
print('-----5-----')
# 数据填满后会等待,可以指定timeout参数
# def put(self, item, block=True, timeout=None)
q1.put(6, timeout=3)
"""
Traceback (most recent call last):
File "/Users/zhongxin/Desktop/py/zx/09/0823.py", line 21, in <module>
q1.put(6, timeout=3)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/queue.py", line 147, in put
raise Full
queue.Full
"""
查看put_nowait代码,其实就是put方法的block设置为False
q1.put(22, block=False) # block设为False,就和put_nowait效果一致
def put_nowait(self, item):
'''Put an item into the queue without blocking.
Only enqueue the item if a free slot is immediately available.
Otherwise raise the Full exception.
'''
return self.put(item, block=False)
from queue import Queue
q1 = Queue(maxsize=5) # If maxsize is <= 0, the queue size is infinite.
# 往队列中添加元素
q1.put(1)
q1.put(2)
q1.put(3)
q1.put(4)
q1.put(5)
print('-----5-----')
# 从队列中获取元素
print(q1.get())
print(q1.get())
print(q1.get())
print(q1.get())
print(q1.get())
print('-----5-----')
print(q1.get(block=False))
"""
Traceback (most recent call last):
File "/Users/zhongxin/Desktop/py/zx/09/0823_1.py", line 26, in <module>
print(q1.get(block=False))
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/queue.py", line 167, in get
raise Empty
_queue.Empty
"""
from threading import Thread
from queue import Queue
num = 0
q = Queue(2)
q.put(num) # 把数据存储在队列中
def work1():
for i in range(1000000):
num = q.get()
num += 1
q.put(num)
def work2():
for i in range(1000000):
num = q.get()
num += 1
q.put(num)
def main():
t1 = Thread(target=work1)
t2 = Thread(target=work2)
t1.start()
t2.start()
t1.join()
t2.join()
print(q.get())
if __name__ == '__main__':
main()
# Put a new item in the queue
def _put(self, item):
self.queue.append(item)
# Get an item from the queue
def _get(self):
return self.queue.popleft()
def _put(self, item):
heappush(self.queue, item)
def _get(self):
return heappop(self.queue)
def _put(self, item):
self.queue.append(item)
def _get(self):
return self.queue.pop()
from queue import PriorityQueue # 优先级队列
pq = PriorityQueue()
pq.put((1, 11))
pq.put((2, 22))
pq.put((0, 33))
pq.put((99, 333))
# 前面的值越小 越先出来
print(pq.get()) # (0, 33)
print(pq.get()) # (1, 11)
print(pq.get()) # (2, 22)
print(pq.get()) # (99, 333)
进程:操作系统分配资源的基本单元
进程的状态:
功能
定义
区别
优缺点
import time
from multiprocessing import Process
def work1():
for i in range(6):
time.sleep(1)
print('执行浇花任务中...')
if __name__ == '__main__':
# 使用多进程来执行多任务
p1 = Process(target=work1)
p1.start()
import time
from multiprocessing import Process
class MyProcess(Process):
def __init__(self, msg):
super().__init__()
self.msg = msg
def run(self):
with open('text.txt', 'a', encoding='utf8') as f:
for i in range(2):
time.sleep(0.5)
f.write(f'{self.msg}\n')
if __name__ == '__main__':
for i in range(2):
MyProcess('python').start()