ThreadAndProcess

ThreadAndProcess

创建线程子类

from threading import Thread
from datetime import datetime
import time


class DownloadThread(Thread):
    def __init__(self, url):
        super().__init__()
        self.url = url

    def run(self) -> None:
        # 确定需要在子线程中完成的任务
        print(f'{self.url}开始下载:{datetime.now()}')
        time.sleep(1)
        print(f'{self.url}下载结束:{datetime.now()}')


t1 = DownloadThread('肖生克的救赎')
t2 = DownloadThread('阿甘正传')
t3 = DownloadThread('霸王别姬')
t1.start()
t2.start()
t3.start()

线程间和进程间通信

from threading import Thread, current_thread
from multiprocessing import Process, current_process

同一个进程中的多个线程数据可以直接共享,不同进程中的数据不能直接共享

  1. 多线程之间的数据通信
# =====================多线程之间的数据通信============================
# a = []
#
#
# def func1():
#     a.append('A')
#
#
# def func2():
#     a.append('B')
#
#
# t1 = Thread(target=func1)
# t2 = Thread(target=func2)
# t1.start()
# t2.start()
# t1.join()
# t2.join()
# print(a)
  1. 进程间有效通信
import time
from multiprocessing import Process
# 多进程的队列
from multiprocessing import Queue

使用多进程队列中需要注意:1.将队列定义全局变量 2.队列对象必须通过在子进程中调用的函数的参数传递到进程中去

def download(name, queue: Queue):
    print(f'{name}开始下载!')
    time.sleep(1)
    print(f'{name}下载完成!')
    # return name+'数据'
    # queue.put(name+'数据')     # 往进程中添加数据
    queue.put([f'{name}10', f'{name}20'])


if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=download, args=('肖生克的救赎', q))
    p2 = Process(target=download, args=('阿甘正传', q))
    p1.start()
    p2.start()
    # p1.join()
    # p2.join()
    # 获取两个进程产生的数据
    print(q.get())      # 获取队列中的数据;如果获取的时候队列中没有数据会阻塞线程一直等,等到有数据或者超时为止
    print(q.get())
    # print(q.get())
    # print(q.get(timeout=2))
    print('=============================')
  1. 线程间有效通信

线程间通信:定义一个全局的容器,在子线程的函数中直接在全局容器中添加数据

from queue import Queue
from threading import Thread
import time


def download(name):
    print(f'{name}开始下载')
    time.sleep(1)
    print(f'{name}下载结束')
    q.put(f'{name}数据')


if __name__ == '__main__':
    q = Queue()
    t1 = Thread(target=download, args=('沉默的羔羊',))
    t2 = Thread(target=download, args=('怦然心动',))
    t1.start()
    t2.start()
    # t1.join()
    # t2.join()
    print(q.get())
    print(q.get())

进程池

from multiprocessing import Pool

import time
def download(name):
    print(f'{name}开始下载')
    time.sleep(1)
    print(f'{name}下载结束')


if __name__ == '__main__':
    # 1.创建进程池对象
    pool = Pool(maxtasksperchild=3)

    # 2.添加任务
    # 1)添加单个任务
    # apply - 添加同步执行
    # apply_async  - 添加异步执行
    pool.apply_async(download, args=('肖生克的救赎',))
    pool.apply_async(download, args=('触不可及',))

    # 2)同时添加多个任务
    # pool.map(download, ['V字仇杀队', '恐怖游轮', '林中小屋'])

    # 3.关闭
    pool.close()   # 停止添加任务
    # pool.apply(download, args=('摔跤吧,爸爸',))
    # 4. 等待
    pool.join()
    print('===========全部完成===========')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值