python进程和线程

本文详细介绍了Python中的进程和线程,包括进程线程的基本概念、多进程(multiprocessing模块,Pool、子进程和进程间通信)、多线程(线程锁、ThreadLocal)以及进程与线程的区别。通过示例代码展示了如何创建、管理和通信,强调了线程同步的重要性,如使用Lock避免数据竞争。最后提到了分布式进程的概念,并指出分布式进程在某些场景下的局限性。
摘要由CSDN通过智能技术生成

进程和线程的基本概念

线程是最小的执行单位,而进程由至少一个线程组成。

多任务的实现有3种方式:
* 多进程模式
* 多线程模式
* 多进程 + 多线程模式

多进程

multiprocessing模块就是跨平台版本的多线程模块。
multiprocessing模块提供了一个Process类来代表一个进程对象。下面的例子演示了启动一个子进程并等待其结束:

from multiprocessing import Process
import os


# 子进程要执行的代码
def run_proc(name):
    print("Run child process %s (%s)...." % (name, os.getpid()))


if __name__ == "__main__":
    print("Parent process %s." % os.getpid())
    p = Process(target=run_proc, args=("test",))
    print("Child process will start.")
    p.start()
    p.join()
    print("Child process end .")

执行结果如下:

Parent process 5916.
Child process will start.
Run child process test (13504)....
Child process end .

创建子进程时, 只需传入一个执行函数和函数的参数, 创建一个Process实例, 用start()方法启动。
join()方法可以等待子进程结束后继续往下执行, 通常用于进程间的同步。

Pool

如果需要启动大量的子进程, 可以用进程池的方法批量创建子进程。

from multiprocessing import Pool
import os, time, random


def long_time_task(name):
    print("Run task %s (%s)...." % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print("Task %s runs %0.2f seconds." % (name, (end - start)))


if __name__ == "__main__":
    print("Parent process %s." % os.getpid())
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print("Waiting for all subprocesses done...")
    p.close()
    p.join()
    print("All subprocesses done...")

运行结果如下:

Parent process 6844.
Waiting for all subprocesses done...
Run task 0 (2420)....
Run task 1 (7392)....
Run task 2 (5396)....
Run task 3 (14276)....
Task 2 runs 0.83 seconds.
Run task 4 (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值