【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)

运行结果:


目录
相关文章
|
17天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
27天前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
1月前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
58 0
|
1月前
|
消息中间件 存储 算法
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
83 0
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
68 0
|
2天前
|
人工智能 安全 Java
Python 多线程编程实战:threading 模块的最佳实践
Python 多线程编程实战:threading 模块的最佳实践
13 5
|
4天前
|
Java 数据库连接 数据处理
Python从入门到精通:3.1.2多线程与多进程编程
Python从入门到精通:3.1.2多线程与多进程编程
|
10天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
28 0
|
25天前
|
安全 Linux API
Android进程与线程
Android进程与线程
18 0
|
25天前
|
数据采集 Java API
python并发编程: Python使用线程池在Web服务中实现加速
python并发编程: Python使用线程池在Web服务中实现加速
18 3
python并发编程: Python使用线程池在Web服务中实现加速