• 线程和进程


    线程和进程

    1)线程和进程

    进程:一个正在运行的应用程序,每个进程运行其专门的且受保护的内存空间

    线程:线程就是进程执行任务的基本单元(一个进程中的任务都是在线程中执行的)

    进程就是车间,线程就是车间的工人

    一个线程中默认有一个线程,这个叫做主线程

    2)线程的特点

    如果一个线程中执行多个任务,任务是串行执行的(当一个程序中有很多个任务的时候,如果只有一个线程,那么执行效率会很低)

    3)多线程

    一个进程中有多个线程就是多线程。多个线程执行任务的时候,多个任务同时(并行)执行。

    4)多线程原理:

    一个CPU同一时间只能调度一个线程,多线程其实就是CPU快速在多个线程之间切换,造成多个线程同时执行的假象(实际上是提高CPU的利用率)

    python使用多线程的方法

    一个进程默认只有一个线程,这个线程叫做主线程,如果有多个线程,主线程以外的叫做子线程

    from threading import Thread
    from datetime import datetime
    from time import sleep
    
    
    # 模拟电影下载。不创建多线程的情况
    from threading import Thread
    from datetime import datetime
    from time import sleep
    
    
    # 模拟电影下载。不创建多线程的情况
    
    def doenload(name):
        print(f'{name}正在下载:{datetime.now()}')
        sleep(2)
        print(f'{name}下载结束:{datetime.now()}')
    
    
    
    
    
    if __name__=='__main__':
        doenload("天下第一")
        doenload("斗罗大陆")
        doenload("猪猪侠")
    #天下第一正在下载:2022-08-18 16:13:26.708714
    #天下第一下载结束:2022-08-18 16:13:28.722060
    #斗罗大陆正在下载:2022-08-18 16:13:28.722060
    #斗罗大陆下载结束:2022-08-18 16:13:30.722841
    #猪猪侠正在下载:2022-08-18 16:13:30.722841
    #猪猪侠下载结束:2022-08-18 16:13:32.730465
    
    
    
    from threading import Thread
    from datetime import datetime
    from time import sleep
    
    
    # 模拟电影下载。创建多线程的情况
    
    def doenload(name):
        print(f'{name}正在下载:{datetime.now()}')
        sleep(2)
        print(f'{name}下载结束:{datetime.now()}')
    
    
    
    
    
    if __name__=='__main__':
        t1 = Thread(target=doenload, args=("天下第一",))
        t2 = Thread(target=doenload, args=('斗罗大陆',))
        t3 = Thread(target=doenload, args=("猪猪侠",))
    
        t1.start()
        t2.start()
        t3.start()
    
        
    天下第一正在下载:2022-08-18 16:15:08.847120
    斗罗大陆正在下载:2022-08-18 16:15:08.847120
    猪猪侠正在下载:2022-08-18 16:15:08.847120
    天下第一下载结束:2022-08-18 16:15:10.859699猪猪侠下载结束:2022-08-18 16:15:10.859699
    斗罗大陆下载结束:2022-08-18 16:15:10.859699
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    创建线程对象:

    线程对象: = Thread(target = 函数,args = 元祖

    • 函数:可以是普通的函数,也可以是匿名函数,这个函数就是需要子线程执行的任务。
    • 元组:元组中的元素就是在子线程中调用target对应的函数的参数

    创建线程后要启动线程

    多线程下载豆瓣电影
    """
    Author: 余婷
    Time: 2022/8/18 16:30
    Good Good Study, Day Day Up!
    """
    import requests
    from datetime import datetime
    from threading import Thread
    
    headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
    }
    
    
    def get_one_page_data(page):
        print(f'第{page}页开始获取:{datetime.now()}')
        url = fr'https://movie.douban.com/top250?start={page}&filter='
        response = requests.get(url, headers=headers)
        print('下载完成!')
        print(f'第{page}页开始获取:{datetime.now()}')
    
    
    if __name__ == '__main__':
        for page in range(0, 256, 25):
            t = Thread(target=get_one_page_data, args=(page,))
            t.start()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    xpath 解析豆瓣电影
    
    import requests
    from lxml import etree
    import csv
    
    
    def get_net_data():
        url = 'https://movie.douban.com/top250'
        headers = {
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        return response.text
    
    
    def analysis_data1(html: str):
        root = etree.HTML(html)
        names = root.xpath('//ol[@class="grid_view"]/li/div/div[@class="info"]/div[1]/a/span[1]/text()')
        scores = root.xpath('//ol[@class="grid_view"]/li/div/div[@class="info"]/div[2]/div/span[@class="rating_num"]/text()')
        comment_count = root.xpath('//ol[@class="grid_view"]/li/div/div[@class="info"]/div[2]/div/span[last()]/text()')
        info = root.xpath('//ol[@class="grid_view"]/li/div/div[@class="info"]/div[2]/p[@class="quote"]/span/text()')
        all_data = list(map(lambda i1, i2, i3, i4: [i1, i2, i3, i4], names, scores, comment_count, info))
        with open('files/电影.csv', 'w', encoding='utf-8', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['电影名称', '评分', '评论数', '简介'])
            writer.writerows(all_data)
    
    
    def analysis_data2(html: str):
        root = etree.HTML(html)
        all_film_div = root.xpath('//ol[@class="grid_view"]/li/div')
        all_data = []
        for div in all_film_div:
            name = div.xpath('./div[@class="info"]/div[1]/a/span[1]/text()')[0]
            score = div.xpath('./div[@class="info"]/div[2]/div/span[2]/text()')[0]
            comment_count = div.xpath('./div[@class="info"]/div[2]/div/span[last()]/text()')[0]
            info = div.xpath('./div[@class="info"]/div[2]/p/span/text()')[0]
            all_data.append([name, score, comment_count, info])
            # print(name, score, comment_count, info)
            # print('------------------------------------------华丽的分割线------------------------------------------------')
        with open('files/电影2.csv', 'w', encoding='utf-8', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['电影名称', '评分', '评论数', '简介'])
            writer.writerows(all_data)
    
    
    if __name__ == '__main__':
        data = get_net_data()
        analysis_data2(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    生产环境sql优化日记——从几十分钟优化到几十秒钟
    JS 的 apply 方法
    嵌入式Linux应用开发-第十三章APP怎么读取按键值
    马来酰亚胺/碳碳双键表面/硫硅烷基团/金属硫蛋白修饰二氧化硅微球的性能与制备
    工业控制系统面临的安全问题分析
    session&&cookies实验
    快速排序(c语言代码实现)
    “扫一扫,不一定是二维码” ScanCan GitHub开源项目发起
    Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?
    比较浮点数时,我被绊倒了
  • 原文地址:https://blog.csdn.net/m0_53957045/article/details/126410307