import time
from threading import Thread
from random import randint
# 1.收集线程数据# 定义一个全局的可变容器, 最好是队列(python中的队列本身是线程安全),将线程中产生的数据添加到容器里面
result =[]defdownload(name):print(f'{name}开始下载!')
time.sleep(randint(2,7))print(f'{name}下载结束!')# 返回'肖生克的救赎二进制'# return f'{name}的二进制'
result.append(f'{name}的二进制')
t1 = Thread(target=download, args=('肖生克的救赎',))
t2 = Thread(target=download, args=('V字仇杀队',))
t3 = Thread(target=download, args=('这个杀手不太冷',))
re1 = t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()print('re1:', re1)print(result)
from queue import Queue
from threading import Thread
import time
from random import randint
# 1.什么是队列# 1)Queue(队列)是一种容器,一般用于多线程和多进程的数据共享,因为Queue对象本身是线程安全# 2)获取队列中的元素的时候,如果没有元素会等待,直到队列中有元素为止# 2.操作队列# 1)添加元素: 队列对象.put(元素)# 2)获取元素(取一个就少一个): 队列对象.get()# data_list = []
queue = Queue()defadd():for x inrange(randint(50,100)):# data_list.append(x)
queue.put(x)print(f'添加数据{x}')# time.sleep(randint(1, 7))defget():whileTrue:# print(f'得到数据:{data_list[-1]}')print(f'得到数据:{queue.get()}')
t1 = Thread(target=add)
t2 = Thread(target=get)
t1.start()# t2.start()
t1.join()print('=======添加完成=======')
queue.put('end')# 获取队列长度print(queue.qsize())whileTrue:
re = queue.get()if re =='end':breakprint(re)# for _ in range(100):# print(queue.get())# print('====:', queue.get())
import threadpool
import time
from datetime import datetime
from threading import current_thread, Thread
from queue import Queue
q = Queue()defdownload(name):print(f'{name}开始下载!', datetime.now())print(current_thread())
time.sleep(1)print(f'{name}开始结束!', datetime.now())
q.put(name)defsave(num):print('====================开始保存========================')whileTrue:print('====保存数据的线程===', current_thread())
result = q.get()print(f'=====保存{result}成功!')# 1.创建任务列表# makeRequests(任务对应的函数, 参数列表) - 创建任务列表# 注意:# 1)任务函数有且只有一个参数# 2)参数列表中元素的个数决定了任务列表中任务的个数
tasks = threadpool.makeRequests(download,[f'电影{x}'for x inrange(100)])
tasks2 = threadpool.makeRequests(save,[0])# 2.创建线程池对象# ThreadPool(线程的数量)
pool = threadpool.ThreadPool(10)# 3.在线程池中添加任务# 线程池对象.putRequest(任务对象)for task in tasks2:
pool.putRequest(task)for task in tasks:
pool.putRequest(task)# 4.执行和等待# 相当于先start 然后 join
pool.wait()print('=============下载结束==============')
import threadpool
import time
from datetime import datetime
from threading import current_thread, Thread
from queue import Queue
q = Queue()defdownload(name):print(f'{name}开始下载!', datetime.now())# print(current_thread())
time.sleep(1)print(f'{name}开始结束!', datetime.now())
q.put(name)defsave():print('====================开始保存========================')
data =[]whileTrue:
result = q.get()if result =='end':break
data.append(result)print(len(data), data)# 1.在线程池中添加下载任务
tasks = threadpool.makeRequests(download,[f'电影{x}'for x inrange(100)])
pool = threadpool.ThreadPool(20)for task in tasks:
pool.putRequest(task)# 2.在一个独立的线程中添加保存任务
t = Thread(target=save)
t.start()# 4.执行和等待
pool.wait()
q.put('end')print('=============下载结束==============')
from multiprocessing import Process
import time
from datetime import datetime
from threading import Thread
# 多进程和多线程的区别:# 多线程只是增加线程数量,不会增加运行内容(只是在车间中添加工人);多个线程可以修改同一个全局变量# 多进程会增加线程数量,也会增加运行内容(添加新的车间,每个车间拥有一个工人);不能在一个进程中修改另外一个进程的数量defdownload(name):# 进程中不能修改其他进程中的数据global a
a +=100
list1.append(name)print('a:', a)print(f'{name}开始下载!', datetime.now())
time.sleep(1)print(f'{name}开始结束!', datetime.now())if __name__ =='__main__':
a =100
list1 =[]# 1.创建进程对象
p1 = Process(target=download, args=('让子弹飞',))
p2 = Process(target=download, args=('赌神',))
p3 = Process(target=download, args=('活着',))# 2.开始执行进程中的任务
p1.start()
p2.start()
p3.start()# 3.等待
p1.join()
p2.join()
p3.join()print('===============进程都结束==================')print(a, list1)
from multiprocessing import Pool
from datetime import datetime
import time
defdownload(name):print(f'{name}开始下载!', datetime.now())
time.sleep(1)print(f'{name}开始结束!', datetime.now())if __name__ =='__main__':# 1.创建进程池# Pool(进程数量)
pool = Pool(3)# 2.添加任务(任务添加完成后会自动启动)# 1)一次性添加多个任务(和主进程同步执行)# 进程池对象.map(函数, 参数列表)# pool.map(download, [f'电影{x+1}' for x in range(20)])# 2)一次添加一个任务# apply() - 添加的任务和主进程中的任务同步执行# apply_async() - 添加的任务和主进程中的任务异步
pool.apply_async(download,('肖生克的救赎',))
pool.apply_async(download,('电影001',))
pool.apply_async(download,('电影002',))# 3.关闭进程池# 进程池关闭后不能再往进程池中添加任务
pool.close()# pool.apply(download, ('恐怖游轮',))for x inrange(100):print(x)# 4.等待
pool.join()print('===================================')
from multiprocessing import Pool
from threadpool import ThreadPool, makeRequests
import time
from threading import Thread
# 用三个进程,每个进程中有10个线程来下载200个电影defdownload(name):print(f'开始下载{name}')
time.sleep(1)print(f'{name}下载结束')defcreate_thread(names):
t_pool = ThreadPool(10)
tasks = makeRequests(download, names)for t in tasks:
t_pool.putRequest(t)
t_pool.wait()if __name__ =='__main__':# 创建进程池
pool = Pool(4)# 创建任务
tasks =[]
ts =[]for x inrange(1,200+1):
ts.append(x)if x %50==0:
tasks.append(ts)
ts =[]
pool.map(create_thread, tasks)print(f'=====================结束===================')
import threadpool
from threadpool import ThreadPool
from queue import Queue
import time
from random import randint
from threading import Thread
q = Queue()defadd(q):print(q)for x inrange(100):
q.put(x)print(f'添加数据:{x}')
time.sleep(randint(1,7))defget(q: Queue):whileTrue:print('取到数据:', q.get())
t1 = Thread(target=add, args=(q,))
t2 = Thread(target=get, args=(q,))
t1.start()
t2.start()# pool1 = ThreadPool(5)# pool2 = ThreadPool(3)## for re in threadpool.makeRequests(add, [q]):# pool1.putRequest(re)### for re in threadpool.makeRequests(get, [q]):# pool2.putRequest(re)## pool1.wait()# pool2.wait()