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

运行结果:


目录
相关文章
|
4月前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
4月前
|
人工智能 安全 调度
Python并发编程之线程同步详解
并发编程在Python中至关重要,线程同步确保多线程程序正确运行。本文详解线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,探讨全局解释器锁(GIL)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
184 0
|
1月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
420 2
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
143 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
162 1
|
1月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
232 0
|
3月前
|
数据采集 消息中间件 并行计算
Python多线程与多进程性能对比:从原理到实战的深度解析
在Python编程中,多线程与多进程是提升并发性能的关键手段。本文通过实验数据、代码示例和通俗比喻,深入解析两者在不同任务类型下的性能表现,帮助开发者科学选择并发策略,优化程序效率。
261 1
|
4月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
4月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。

热门文章

最新文章

推荐镜像

更多