python学习(十)进程和线程

本文深入探讨Python的多进程与多线程。介绍了multiprocessing模块,包括Pool和子进程,以及进程间通信的方式。同时阐述了多线程的概念,如Lock和线程切换,并讨论了在多核CPU上的表现。此外,文章还提到了ThreadLocal和进程VS线程的区别,以及在计算密集型和IO密集型任务中的应用。最后,简述了分布式进程及其在分布式计算中的作用。
摘要由CSDN通过智能技术生成
  • 一个任务就是一个进程(Process)。
  • 一个进程内部,同时干多件事,同时运行多个“子任务”,“子任务”称为线程(Thread)。
  • 同时执行多个任务:多进程模式;多线程模式;多进程+多线程模式。(同步、数据共享)
  • 线程是最小的执行单元,而进程由至少一个线程组成。

多进程(multiprocessing)

  • Unix/Linux提供fork()系统调用,调用一次,返回两次;
  • 操作系统自动把当前进程(父进程)复制了一份(子进程),分别在父进程和子进程内返回。
  • 子进程永远返回0,而父进程返回子进程的ID
  • 子进程调用getppid()可以拿到父进程的ID
  • os模块封装了常见的系统调用,其中就包括fork
import os

print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.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))


'''
Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.

'''
  • fork调用,一个进程在接到新任务时可复制出一个子进程来处理新任务。

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.')
    # 用start()方法启动
    p.start()
    # 等待子进程结束后再继续往下运行,通常用于进程间的同步。
    p.join()
    print('Child process end.')

'''
Parent process 928.
Child process will start.
Run child process test (929)...
Process end.
'''

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())
    # 最多同时执行4个进程,默认大小是CPU的核数
    p = Pool(4)
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done...')
    # 调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process
    p.close()
    # join()方法会等待所有子进程执行完毕
    p.join()
    print('All subprocesses done.')

'''
Parent process 669.
Waiting for all subprocesses done...
Run task 0 (671)...
Run task 1 (672)...
Run task 2 (673)...
Run task 3 (674)...
Task 2 runs 0.14 seconds.
Run task
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值