python DAY_12(1) 并行,线程和进程编程

学习内容:
1._thread模块
2.threading模块
3.同步锁
4.qunue队列
5.mulprocesing操作
6.current.features模块
重点
1._thread模块的使用有别于其他模块
_表示python已经不推荐使用,但是为了基础学习,还是使用该命令

import time
import _thread


def work(n):
    print(f'程序开始于:{time.ctime()}')
    time.sleep(n)
    print("程序结束于:{}".format(time.ctime()))


def main():
    print(f'主程序开始于:{time.ctime()}')
    _thread.start_new(work, (5,))
    _thread.start_new(work, (2,))
    time.sleep(7)
    print(f"主程序结束于:{time.ctime()}")


if __name__ == "__main__":
    main()

注意 _thread.start_new(work, (2,))输入的是元组!!
结果如下
在这里插入图片描述

2.threadi模块的使用

import time
import _thread
import threading


def work(n):
    print(f'程序开始于:{time.ctime()}')
    time.sleep(n)
    print("程序结束于:{}".format(time.ctime()))


def main():
    print(f'主程序开始于:{time.ctime()}')
    # _thread.start_new(work, (5,))
    # _thread.start_new(work, (2,))
    threads = []
    t1 = threading.Thread(target=work, args=(6,))
    threads.append(t1)
    t2 = threading.Thread(target=work, args=(2,))
    threads.append(t2)
    for s in threads:
        s.start()
    for s in threads:
        s.join()
    # time.sleep(7)
    print(f"主程序结束于:{time.ctime()}")


if __name__ == "__main__":
    main()

s.start()启动线程
代码中我们发现有s.join()的指令,这个指令作用很大,他将主程序的线程与子线程同步,在子线程结束时,主线程才结束
结果如下
在这里插入图片描述
但是这里有一个弊端,我们并不知道线程的顺序
解决方法是用threading.current_thread().name指令,代码如下

import time
import _thread
import threading


def work(n):
    print(f'{threading.current_thread().name}程序开始于:{time.ctime()}')
    time.sleep(n)
    print("{}程序结束于:{}".format(threading.current_thread().name, time.ctime()))


def main():
    print(f'主程序开始于:{time.ctime()}')
    # _thread.start_new(work, (5,))
    # _thread.start_new(work, (2,))
    threads = []
    t1 = threading.Thread(target=work, args=(6,))
    threads.append(t1)
    t2 = threading.Thread(target=work, args=(2,))
    threads.append(t2)
    for s in threads:
        s.start()
    for s in threads:
        s.join()
    # time.sleep(7)
    print(f"主程序结束于:{time.ctime()}")


if __name__ == "__main__":
    main()

自己写thread派生类,实现功能!!
对于以后的工作学习有帮助

代码如下

import time
import _thread
import threading


def work(n):
    print(f'{threading.current_thread().name}程序开始于:{time.ctime()}')
    time.sleep(n)
    print("{}程序结束于:{}".format(threading.current_thread().name, time.ctime()))


class Mythread(threading.Thread):  # 我定义的继承于threading.Thread
    def __init__(self, fun, args):
        threading.Thread.__init__(self)
        self.fun = fun
        self.args = args

    def run(self):
        self.fun(*self.args)


def main():
    print(f'主程序开始于:{time.ctime()}')
    # _thread.start_new(work, (5,))
    # _thread.start_new(work, (2,))
    threads = []

    # t1 = threading.Thread(target=work, args=(6,))

    t1 = Mythread(work, (4,))

    threads.append(t1)

    # t2 = threading.Thread(target=work, args=(2,))

    t2 = Mythread(work, (2,))
    threads.append(t2)

    for s in threads:
        s.start()
    for s in threads:
        s.join()
    # time.sleep(7)
    print(f"主程序结束于:{time.ctime()}")


if __name__ == "__main__":
    main()

3.同步原语:锁
以打游戏的顺序为例
假设目前有三台游戏机,每台游戏机需要5个人来玩,假设玩的速度一样

import time
import threading


play = []


def order_play(n, lst=[]):#打游戏的顺序
    for i in range(1, n + 1):
        lst.append(i)


def main():
    thread = []
    for i in range(3):#创建三台游戏机
        i = threading.Thread(target=order_play, args=(5, play))#引用threading操作
        thread.append(i)
    for t in thread:
        t.start()
    for t in thread:
        t.join()
    print(play)


if __name__ == "__main__":
    main()
    

结果如下
在这里插入图片描述

每个人每台游戏机都会玩,而且顺序一定,但是,如果我们玩的时间不一致,那么会导致什么结果呢

import time
import threading
import random

play = []


def order_play(n, lst=[]):
    for i in range(1, n + 1):
        time.sleep(random.randint(0, 3))#玩的时间随机
        lst.append(i)


def main():
    thread = []
    for i in range(3):
        i = threading.Thread(target=order_play, args=(5, play))
        thread.append(i)
    for t in thread:
        t.start()
    for t in thread:
        t.join()
    print(play)


if __name__ == "__main__":
    main()

结果如下
在这里插入图片描述
这个时候我为了规范顺序,引入锁!

import time
import threading
import random

play = []
lock = threading.Lock()


def order_play(n, lst=[]):
    with lock:
        for i in range(1, n + 1):
           time.sleep(random.randint(0, 3))
           lst.append(i)


def main():
    thread = []
    for i in range(3):
        i = threading.Thread(target=order_play, args=(5, play))
        thread.append(i)
    for t in thread:
        t.start()
    for t in thread:
        t.join()
    print(play)


if __name__ == "__main__":
    main()
lock.acquire()
   for i in range(1, n + 1):
    time.sleep(random.randint(0, 3))
    lst.append(i)
lock.release()

lock在threading自带,所以吗,导入threading即可
结果如下
在这里插入图片描述

4.队列
FIFO队列常见操作
在这里插入图片描述

FIFO队列的实现

import time
import queue
import random
import threading


def produce(data_queue):
    for i in range(5):
        time.sleep(1)
        item = random.randint(1, 100)
        data_queue.put(item)
        print(f"{threading.current_thread().name}在队列中放入数据:{item}")


def consumer(data_queue):
    while True:
        try:
            item = data_queue(timeout=3)
            print(f"{threading.current_thread().name}从队列中移除:{item}")
        except queue.Empty:
            break
        else:
            data_queue.task_done()


def main():
    q = queue.Queue()
    thread = []
    p = threading.Thread(target=produce, args=(q,))
    p.start()

    for i in range(3):
        c = threading.Thread(target=consumer, args=(q,))
        thread.append(c)
    for s in thread:
        s.start()
    for s in thread:
        s.join()
    p.join()


if __name__ == '__main__':
    main()

一个放,四个出
5.mulproces的操作
多进程操作可以提高CPU利用率,适用于计算密集型任务

import time
import _thread
import threading
import multiprocessing


def work(n):
    print(f'{threading.current_thread().name}程序开始于:{time.ctime()}')
    time.sleep(n)
    print("{}程序结束于:{}".format(threading.current_thread().name, time.ctime()))


def main():
    print(f'主程序开始于:{time.ctime()}')
    # _thread.start_new(work, (5,))
    # _thread.start_new(work, (2,))
    # threads = []
    # t1 = threading.Thread(target=work, args=(6,))
    # threads.append(t1)
    # t2 = threading.Thread(target=work, args=(2,))
    # threads.append(t2)
    # for s in threads:
    #   s.start()
    # for s in threads:
    #  s.join()
    # time.sleep(7)
    processes = []
    p1 = multiprocessing.Process(target=work, args=(4,))
    processes.append(p1)
    p2 = multiprocessing.Process(target=work, args=(2,))
    processes.append(p2)
    for s in processes:
        s.start()
    for s in processes:
        s.join()
    print(f"主程序结束于:{time.ctime()}")


if __name__ == "__main__":
    main()

我在之前的threading代码块上直接进行了修改,方便大家看出区别
结果如下,

在这里插入图片描述
6.current.features模块
在这里插入图片描述
这个模块下面分别有线程执行和进程执行两种
在以下代码可以找出他们的差异

import time
import concurrent.futures

number = list(range(1, 10))


def count(n):
    for i in range(100000):
        i += i
    return i * n


def worker(x):
    result = count(x)
    print(f"数字{x}的计算结果{result}")


# 顺序执行
def m1():  # 顺序执行
    start_time = time.perf_counter()
    for i in number:
        worker(i)
    print(f"顺序执行的花费是:{time.perf_counter() - start_time}")


def m2():  # 线程池执行
    start_time = time.perf_counter()
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as  executor:
        for i in number:
            executor.submit(worker, i)
    print(f"顺序执行花费时间:{time.perf_counter() - start_time}")


def m3():  # 进程池执行
    start_time = time.perf_counter()
    with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
        for i in number:
            executor.submit(worker, i)
    print(f"顺序执行时间:{time.perf_counter() - start_time}")

分别执行m1(),m2(),m3()就能看到差别了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值