python进程与线程,完整版装饰器

本文深入探讨了Python中的函数迭代,重点介绍了`yield`如何创建生成器。此外,还讲解了不定长参数`*args`和`**kwargs`的用法。在进程与线程部分,阐述了并发的概念,区分了并发与并行,并提到高并发在互联网系统设计中的重要性。文中通过具体案例说明了如何利用多线程实现并发任务,以解决进程阻塞问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的迭代

  • 一个简单的for循环
def A():
    for i in range(10):
        print(i)
A()
"""
结果:0 1 2 3 4 5 6 7 8 9
"""
  • yield将函数变成一个迭代器(生成器)
    yield后面函数不运行(但运行第二次后会出来)
    好处是能更加被泛化,可写别的代码
def A():
    for i in range(10):
        yield i
a = A()
print(next(a))
#结果next之后会一个一个的出来

将print换成try except
try except 尝试执行try中的代码,如果错误,则被except捕获,但整个程序不会崩溃

def A():
    for i in range(5):
        yield i
try:
    a=A()
    print(next(a))
    print(next(a))
    print(next(a))
    print(next(a))
    print(next(a))
    print(next(a))
except Exception as e:
    print(e)
print('Hello World')

不定长参数

  1. *args:位置传参
def hh(*args):
	print(args)
hh(1)
#结果:(1,)

hh(1,2,3,4)
#结果:(1,2,3,4)

(1)print里的args可改名,args是约定俗成的名字
(2)(,,)元组 [ ]列表 { }字典

  1. kwargs:带参数名的传参
def lala(**kwargs):
	print(kwargs)
lala(a=1,b=2,c=3)
#结果:{'a':1,'b':2,'c':3}
  1. *args + **kwargs
    *args要放在前面(因为带默认传参的要放在最后)
def heihei(*args,**kwargs):
	print(*args)
	print(**kwargs)
heihei(1,2,3,a=1,b=2,c=3)
#结果:(1,2,3){'a':1,'b':2,'c':3}
  • 案例:”钩子“,三个页面:A,B,C.去检测IP是否频繁访问,是则返回404
#被引用
def count(func):
    def warp(*args,**kwargs):
        COUNT = kwargs['COUNT']
        if COUNT > 3:
            print('404')

        else:
            return func(*args,**kwargs)
    return warp
import time
from test88 import count
#导包一定得是同一个文件夹里的才能这么写,而且放一个文件夹里也最方便,若是上级加.

COUNT = 0

@count
def Page_1(COUNT):
    print('jxr你真是可爱啊')

if __name__=='__main__':
    for i in range(5):
        COUNT += 1
        Page_1(COUNT=COUNT)
#结果:
#Jacinta你真是可爱啊
#Jacinta你真是可爱啊
#Jacinta你真是可爱啊
#Jacinta你真是可爱啊
#404

进程与线程

  • 并发:一个工作者 时间段不同,做的事不同:间隔发生(线程)
    并行:多个工作者,时间段相同,做的事不同:同时发生(进程)
    高并发:互联网分布式系统架构设计中心必须考虑的因素之一,通过设计保证系统能够同时进行处理很多请求
    PID:进程号(唯一)
  • 案例:
from random import randint
from time import time, sleep


def download_task(filename):
    print('开始下载%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))


def main():
    start = time()
    download_task('Python从入门到住院.pdf')
    download_task('Peking Hot.avi')
    end = time()
    print('总共耗费了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()

#结果:
#开始下载Python从入门到住院.pdf...
#Python从入门到住院.pdf下载完成! 耗费了6秒
#开始下载Peking Hot.avi...
#Peking Hot.avi下载完成! 耗费了7秒
#总共耗费了13.01秒.

以上:程序中的代码只能按顺序一点点的往下执行,那么即使执行两个毫不相关的下载任务,也需要先等待一个文件下载完成后才能开始下一个下载任务

使用多线程的方式将两个下载任务放在不同的进程中:

#多进程的库
from multiprocessing import Process
from os import getpid
from random import randint
from time import time, sleep


def download_task(filename):
    print('启动下载进程,进程号[%d].' % getpid())
    print('开始下载%s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))


def main():
    start = time()
    #开始两个进程         函数名              传递的参数,需要注意的是,它接受的是一个元组(tuple)
    p1 = Process(target=download_task, args=('Python从入门到住院.pdf', ))
    p2 = Process(target=download_task, args=('Peking Hot.avi', ))
    #启动进程
    p1.start()
    p2.start()
    #进程阻塞
    p1.join()
    p2.join()
    end = time()
    print('总共耗费了%.2f秒.' % (end - start))


if __name__ == '__main__':
    main()

#结果:
#启动下载进程,进程号[1530].
#开始下载Python从入门到住院.pdf...
#启动下载进程,进程号[1531].
#开始下载Peking Hot.avi...
#Peking Hot.avi下载完成! 耗费了7秒
#Python从入门到住院.pdf下载完成! 耗费了10秒
#总共耗费了10.01秒.

进程阻塞的原因:防止主进程不等两个进程走完进度就自行结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值