【Python】进程和线程

简介: 【Python】进程和线程

1. 什么是进程和线程?

进程是操作系统资源分配的基本单位,

线程是处理器任务调度和执行的基本单位

每个进程至少有一个线程

image.png

2. 多线程的创建

2-1 单线程demo

def func(name):
    for i in range(1000):
        print(name,i)
if __name__ == '__main__':
    func(name='hello')
    func(name='world')

运行结果:


image.png


可以看到只有运行了上面的那个函数才会开始下面的执行

而线程就是能够根据CPU资源的情况对线程的运行进行控制

下面是实现线程的两种方法

2-2 实现线程方法一:创建线程对象

from threading import Thread
def func(name):
    for i in range(1000):
        print(name,i)
if __name__ == '__main__':
    # 将func('hello')交给线程1
    t1 = Thread(target=func,args=('hello',)) # 参数必须是以元祖的方式传递,因此需要加逗号,否则传递的为字符串
    # 启动线程1
    t1.start()
    t2 = Thread(target=func,args=('world',)) # 参数必须是以元祖的方式传递,因此需要加逗号,否则传递的为字符串
    # 启动线程1
    t2.start()
    for i in range(1000):
        print('xiaoshan',i)

image.png


结果混在一起执行,多任务执行

2-3 实现线程方法二:创建线程类

from threading import Thread
class MyThread(Thread):
    def run(self):
        for i in range(500):
            print("thread",i)
if __name__ == '__main__':
    t1 = MyThread()
    t1.start()
    for i in range(100):
        print("xianxue",i)
    print("over!!!")

多线程执行结果.png

3. 进程

3-1 创建多进程

和创建线程的方式一模一样

from multiprocessing import Process
def func(name):
    for i in range(1000):
        print(name,i)
if __name__ == '__main__':
    # 将func('hello')交给线程1
    t1 = Process(target=func,args=('hello',)) # 参数必须是以元祖的方式传递,因此需要加逗号,否则传递的为字符串
    # 启动线程1
    t1.start()
    t2 = Process(target=func,args=('world',)) # 参数必须是以元祖的方式传递,因此需要加逗号,否则传递的为字符串
    # 启动线程1
    t2.start()
    for i in range(1000):
        print('xiaoshan',i)

image.png

4. 线程池

from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
def func(name):
    for i in range(100):
        print(name,i)
if __name__ == '__main__':
    with ThreadPoolExecutor(20) as t:
        for i in range(10):
            t.submit(func,name=f'小单{i}')
    print('over!!')

image.png

3-3 案例,爬取北京新发地的物价:

import requests
import json
import csv
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
url = "http://www.xinfadi.com.cn/getPriceData.html"
def download_page_content(url,current):
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
    }
    dat = {
        "limit": 20,
        "current": current,
        "pubDateStartTime": "2023/06/01",
        "pubDateEndTime": "2023/06/30",
        "prodPcatid": "1186",
        "prodCatid": "1199",
        "prodName": ""
    }
    resp = requests.post(url, data=dat, headers=headers)
    resp.encoding = 'utf-8'
    content = resp.text
    content = json.loads(content)
    prod_price_list = content["list"]
    for item in prod_price_list:
        prodName = item["prodName"]
        lowPrice = item["lowPrice"]
        highPrice = item["highPrice"]
        avgPrice = item["avgPrice"]
        pubDate = item["pubDate"]
        csvwriter.writerow([prodName,lowPrice,highPrice,avgPrice,pubDate])
    resp.close()
if __name__ == '__main__':
    f = open("xfdpriceData.csv",mode="w")
    csvwriter = csv.writer(f)
    with ThreadPoolExecutor(20) as t:
        for i in range(1,18):
            t.submit(download_page_content, url=url, current=i)

运行结果:


目录
相关文章
|
30天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
43 1
|
27天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
9天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
14天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
11天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
22 1
|
16天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
33 2
|
18天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
21天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
39 4
|
21天前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
44 1
|
28天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。