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

运行结果:


目录
相关文章
|
20天前
|
UED 开发者 Python
探索操作系统的心脏:理解进程与线程
【8月更文挑战第31天】在数字世界的海洋中,操作系统犹如一艘巨轮,其稳定航行依赖于精密的进程与线程机制。本文将揭开这一机制的神秘面纱,通过深入浅出的语言和直观的代码示例,引领读者从理论到实践,体验进程与线程的魅力。我们将从基础概念出发,逐步深入到它们之间的联系与区别,最后探讨如何在编程实践中高效运用这些知识。无论你是初学者还是有经验的开发者,这篇文章都将为你的技术之旅增添新的航标。
|
8天前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
30 10
|
5天前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第46天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
4天前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
15 1
|
7天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
12 3
|
9天前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
26 5
|
9天前
|
消息中间件 Kafka 数据安全/隐私保护
Python IPC实战指南:构建高效稳定的进程间通信桥梁
【9月更文挑战第11天】在软件开发中,随着应用复杂度的提升,进程间通信(IPC)成为构建高效系统的关键。本文通过一个分布式日志处理系统的案例,介绍如何使用Python和套接字实现可靠的IPC。案例涉及定义通信协议、实现日志发送与接收,并提供示例代码。通过本教程,你将学会构建高效的IPC桥梁,并了解如何根据需求选择合适的IPC机制,确保系统的稳定性和安全性。
24 5
|
11天前
|
API Python
探索Python中的多线程编程
探索Python中的多线程编程
32 5
|
11天前
|
消息中间件 网络协议 Python
工具人逆袭!掌握Python IPC,让你的进程从此告别单打独斗
【9月更文挑战第9天】你是否曾遇到多个Python程序像孤岛般无法通信,导致数据孤立、任务难协同的问题?掌握进程间通信(IPC)技术,可助你打破这一僵局。IPC是不同进程间传递数据或信号的机制,在Python中常用的方法有管道、消息队列、共享内存及套接字等。其中,管道适用于父子或兄弟进程间简单数据传递;套接字则不仅限于本地,还能在网络间实现复杂的数据交换。通过学习IPC,你将能设计更健壮灵活的系统架构,成为真正的编程高手。
15 3
|
12天前
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
15 4