IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python多线程编程入门 -> 正文阅读

[Python知识库]Python多线程编程入门

Python多线程编程入门

一、任务、进程和线程

现代操作系统比如Mac OS X, Linux,Windows等,都是支持“多任务”的操作系统。

什么叫“多任务”(multitasking)呢?简单地说,就是操作系统可以同时运行多个任务。例如你一边在用浏览器上查资料,一边在听MP3,一边在用Word写文档,这就是多任务。

打开Windows的任务管理器,可以直观的了解一下:

任务

(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现。

单核CPU如何实现“多任务”

三个任务A,B,C在单个CPU上交替执行,逻辑上表现为三个执行实例并发执行,但实质物理上是串行执行。

多核CPU如何实现“多任务”

多任务的真正并行只能在多核CPU上实现,但是,一般而言,任务的数量多于CPU的核数,还是需要将多个任务轮流调度到每个核上执行。

单核与多核处理器(Multi-core processor)示例

多核CPU:简单地说是将多个核心装载一个封装里,外观上看是一个处理器。

串行:一个处理完再一个。

并行:指两个或者多个事件在同一时刻发生。

并发:指两个或多个事件在同一时间间隔内发生。

例如:并发时你正在吃饭,吃到一半电话响,去接电话,接完后继续吃饭;并行时边吃饭边打电话。

进程

(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。

线程

(tread)则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据 ,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的 。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。

进程和线程的关系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

(3)处理机分给线程,即真正在处理机上运行的是线程。

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

二、Python既支持多进程,又支持多线程

multiprocessing --- 基于进程的并行 — Python 3.10.0 文档

threading --- 基于线程的并行 — Python 3.10.0 文档

Python实现多进程

在Unix/Linux下,Mac系统是基于BSD(Unix的一种)内核,都可以使用fork()调用实现多进程,Python的os模块封装了常见的系统调用,其中就包括fork。例如:

import os

print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()  #Windows中不支持fork(),将报错
if pid == 0:
    print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

需要注意的是,上述代码在Unix/Linux、Mac系统中可以运行,但在Windows中运行报错:

AttributeError: module 'os' has no attribute 'fork'

因为Windows没有fork调用,怎么办?

multiprocessing模块是跨平台版本的多进程模块。在Windows上用Python编写多进程的程序,可以使用multiprocessing模块。multiprocessing模块提供了一个Process类来代表一个进程对象。

Process进程类的说明

Process([group [, target [, name [, args [, kwargs]]]]])

group:指定进程组,目前只能使用None

target:执行的目标任务名

name:进程名字,默认为Process-N,N为从1开始递增的整数

args:以元组方式给执行任务传参

kwargs:以字典方式给执行任务传参

Process创建的实例对象的常用方法:

start():启动子进程实例(创建子进程)

join():等待子进程执行结束

terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

例如:

import multiprocessing
import time

# 跳舞任务
def dance():
    for i in range(3):
        print("跳舞中...")
        time.sleep(0.2)

# 唱歌任务
def sing():
    for i in range(3):
        print("唱歌中...")
        time.sleep(0.2)

dance_process = multiprocessing.Process(target=dance(), name="myprocess1")
sing_process = multiprocessing.Process(target=sing())

# 启动子进程执行对应的任务
dance_process.start()
sing_process.start()

执行结果如下图:

Python实现多线程

多任务可以由多进程完成,也可以由一个进程内的多线程完成。

Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,使用threading这个高级模块。

线程类Thread

Thread([group [, target [, name [, args [, kwargs]]]]])

group: 线程组,目前只能使用None

target: 执行的目标任务名

args: 以元组的方式给执行任务传参

kwargs: 以字典方式给执行任务传参

name: 线程名,一般不用设置

Thread类提供了以下方法:

run(): 用以表示线程活动的方法。

start():启动线程活动。

join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

isAlive(): 返回线程是否活动的。

getName(): 返回线程名。

setName(): 设置线程名。

启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行,例子:

import time, threading

# 新线程执行的代码:
def loop():
    print('thread %s is running...' % threading.current_thread().name)
    n = 0
    while n < 5:
        n = n + 1
        print('thread %s >>> %s' % (threading.current_thread().name, n))
        time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)

print('thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)

执行结果如下图:

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:24:12  更:2021-12-04 13:26:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:45:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码