此为学习笔记,如有错误请指正
概念
进程:是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列。进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
线程:是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位。一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
协程:
- 协程是属于线程的。协程程序是在线程里面跑的,因此协程又称微线程和纤程等
- 协没有线程的上下文切换消耗。协程的调度切换是用户(程序员)手动切换的,因此更加灵活,因此又叫用户空间线程.
- 原子操作性。由于协程是用户调度的,所以不会出现执行一半的代码片段被强制中断了,因此无需原子操作锁。
开启线程池,进程池
# 开启线程池
from concurrent.futures import ThreadPoolExecutor
if __name__ == '__main__':
pool = ThreadPoolExecutor(max_workers=5)
for i in range(5):
pool.submit(possword, i)
pool.shutdown()
# 开启进程池
from multiprocessing import Pool
if __name__ == '__main__':
list_urls = [item for item in range(0, 5)]
pool = Pool(5)
pool.map(possword, list_urls)
pool.close()
pool.join()
# 开启线程池套用进程池
from concurrent.futures import ThreadPoolExecutor
from multiprocessing import Pool
def process(t):
pool = ThreadPoolExecutor(max_workers=5)
for i in range(5):
pool.submit(possword, i + t * 10)
pool.shutdown()
if __name__ == '__main__':
pool = Pool(processes=1)
for i in range(1):
pool.apply_async(process, args=(i,))
pool.close()
pool.join()
通过队列开启多线程
import queue
from threading import Thread
def read():
for i in range(10000000):
q1.put(i)
for i in range(100):
q1.put('end')
def chuli(i):
while True:
data = q1.get()
if data == 'end': # 在该线程中读取到'end'即停止
break
print(data)
def main():
for i in range(1):
c1 = Thread(target=read)
c1.start()
for i in range(10): # 10线程操作
c1 = Thread(target=chuli, args=(i,)) # 可以选择传参,如传递i
c1.start()
if __name__ == '__main__':
q1 = queue.Queue(5000) # 队列最大数
main()
"""
-*- coding: utf-8 -*-
单线程读取,多线程处理,单线程写入
"""
from threading import Thread
import queue
def read():
with open(r'.\torrents_name.txt', 'r', encoding='utf-8') as f1:
for line in f1:
line = line.replace('\n', '')
q1.put(line)
for i in range(100):
q1.put('end')
def chuli():
while True:
line = q1.get()
if line == 'end': # 在该线程中读取到'end'即停止
q2.put('end')
print(f'处理结束')
break
data = 'abcd:' + line
q2.put(data)
def write():
count = 0
while True:
data_2 = q2.get()
if data_2 == 'end':
count += 1
if count == 10:
print('写入结束')
break
else:
with open(r'.\torrents_name_txt.txt', 'a+', encoding='utf-8') as f2:
f2.write(data_2 + '\n')
def main():
for i in range(1):
c1 = Thread(target=read)
c1.start()
for i in range(10): # 10线程操作
c1 = Thread(target=chuli) # 可以选择传参,如传递i
c1.start()
for i in range(1):
c1 = Thread(target=write)
c1.start()
if __name__ == '__main__':
q1 = queue.Queue(200) # 队列最大数
q2 = queue.Queue(200)
main()