首页 > 系统相关 >python3之多进程线程

python3之多进程线程

时间:2024-01-17 13:55:32浏览次数:27  
标签:Process process start 线程 child print 之多 os python3

本文内容参考 https://www.liaoxuefeng.com/wiki/1016959663602400/1017628290184064  

多进程

os模块的fork()

多进程(multiprocessing):Unix/Linux操作系统提供了一个fork()函数,fork()函数调用时,操作系统自动把当前进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。 子进程永远返回0,而父进程返回子进程的ID。
import os

print("Parent Process ({}) start".format(os.getpid()))
# 下面的5行代码只在Unix/Linux/Mac系统生效,windows系统os没有fork
try:
    pid = os.fork()
    if pid == 0:
        print("child process ({}) ,parent process ({})".format(os.getpid(), os.getppid()))
    else:
        print("parent process ({}) fork a child process ({}).".format(os.getpid(), pid))
except AttributeError as err:
    print(err) 

windows环境输出

Parent Process (4612) start
module 'os' has no attribute 'fork'

multiprocessing模块

windows 环境中多进程可以使用multiprocessing模块 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
from multiprocessing import Process


# 子进程要执行的代码
def run_proc(name):
    print("Run child process {} ({})...".format(name, os.getpid()))
    time.sleep(random.random())
    print("child process {} ({}) done".format(name, os.getpid()))


# 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
if __name__ == "__main__":
    print("Parent Process ({}) start...".format(os.getpid()))
    p = Process(target=run_proc, args=("test",))
    print("Child process will start.")
    p.start()
    p.join()
    print("Child process end.")

输出

Parent Process (6304) start...
Child process will start.
Run child process test (20676)...
child process test (20676) done
Child process end.
测试过程中发现了一个问题:
from multiprocessing import Process


print("Parent Process ({}) start".format(os.getpid()))


def run_proc(name):
    print("Run child process {} ({})...".format(name, os.getpid()))
    time.sleep(random.random())
    print("child process {} ({}) done".format(name, os.getpid()))


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

输出内容让我觉得有些迷糊:

Parent Process (22880) start
Child process will start.
Parent Process (16272) start
Run child process test (16272)...
child process test (16272) done
Child process end.

还有

from multiprocessing import Process


print("Parent Process ({}) start".format(os.getpid()))


def run_proc(name):
    print("Run child process {} ({})...".format(name, os.getpid()))
    time.sleep(random.random())
    print("child process {} ({}) done".format(name, os.getpid()))


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

输出

Parent Process (18116) start
Parent Process (18116) start...
Child process will start.
Parent Process (11684) start
Run child process test (11684)...
child process test (11684) done
Child process end.

进程池

 

import time, random
from multiprocessing import Process, Pool


def run_proc(name):
    print("Run child process {} ({})...".format(name, os.getpid()))
    time.sleep(random.random())
    print("child process {} ({}) done".format(name, os.getpid()))
    
# 进程池
if __name__ == "__main__":
    print("Parent Process ({}) start...".format(os.getpid()))
    p = Pool(4)
    for i in range(5):
        p.apply_async(run_proc, args=(i,))
    print("Waiting for all subprocesses done...")
    p.close()
    p.join()
    print("All subprocesses done.")

输出

Parent Process (836) start...
Waiting for all subprocesses done...
Run child process 0 (19948)...
Run child process 1 (5084)...
Run child process 2 (14552)...
Run child process 3 (7928)...
child process 0 (19948) done
child process 2 (14552) done
Run child process 4 (19948)...
child process 1 (5084) done
child process 3 (7928) done
child process 4 (19948) done
All subprocesses done.

 

标签:Process,process,start,线程,child,print,之多,os,python3
From: https://www.cnblogs.com/caroline2016/p/17969569

相关文章

  • 线程同步-uvm_event的用法
    在验证中可能出现一种场景:某些cfg在仿真过程中会更新,tb中用到这些cfg的component需要及时更新到最新的cfg.这里有两种解决方法方案一、通过config_dbset/get将cfg传到component的时候,由于传递的是cfg的句柄,所以在component中直接引用句柄中的值xxx_cfg.xxx,就可以实时得到cfg中......
  • linux之线程概念(八千字长文详解)
    linux之线程概念线程的概念首先我们要进程和线程区分开来什么是进程——专业点的说法就是加载到内存的一个执行流!而在linux里面本质点的来说就是内核数据结构+进程对应的代码和数据每一个进程——都有自己独立的PCB,自己的进程地址空间,页表进程地址空间决定了,进程能够看到的......
  • OpenMP学习 第四章 线程与OpenMP编程模型
    第四章线程与OpenMP编程模型编译器指令为了将顺序程序转换为并行程序,修改代码的最小干扰方式是通过编译器指令.在C/C++中,指令通过编译器表示#pragmaompparallel[clause[[,]clause]...]#pragmaompparallelprivate(x){//codeexecutedbyeachthread}大部分......
  • 线程池源码学习
    使用线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以......
  • 爬虫-多线程抓取图片
    一、目的利用多线程的方式爬取图片,地址:其他电脑动态壁纸-其他桌面动态壁纸-元气壁纸(cheetahfun.com)二、分析F12分析网页结构,图片的地址都在class="flexflex-wrapjustify-betweenfont-normal"标签中的li里面,只需要在a标签中img中  根据前面学过的内容,......
  • 面试学习——线程篇
    Thread的生命周期指线程从创建到销毁的整个过程。在线程的生命周期中,可能会经历不同的状态变化。线程的运行状态:NEW:线程对象被创建,未启动线程READY:start()启动RUNNABLE(可以运行的线程状态):线程已被加载到线程调度器的就绪队列中,等待CPU的调度执行。RUNNING:线程正在执......
  • 多线程(Java.Thread)学习(完结)
    多线程(Java.Thread)学习线程简介:1、线程是独立执行的路径2、程序运行时有很多后台进程比如主线程、young.gc、full.gc()3、main是主线程,系统入口,用于执行整个程序4、一个进程中、如果开辟多个线程,线程的运行由调度器安排调度、调度器的先后顺序不能人为干预5、对同一份资......
  • MFC---多线程(线程死锁)
    死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。#include<stdio.h>#include<windows.h>#include<process.h>intiTickets=5000;CRITICAL_SECTIONg_csA;CRITICAL_SECTIONg_csB;//A窗口B窗口DWORDWINAPISellT......
  • MFC---多线程(线程同步之信号量)
    内核对象的状态触发状态(有信号状态),表示有可用资源。未触发状态(无信号状态),表示没有可用资源工作原理以一个停车场是运作为例。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来......
  • MFC---多线程(各种线程同步的比较总结)
    windows线程同步的方式主要有四种:互斥对象Mutex、事件对象event和关键代码段criticalSection,信号量对于上面介绍的三种线程同步的方式,它们之间的区别如下所述:●互斥对象和事件以及信号量都属于内核对象,利用内核对象进行线程同步时,速度较慢,但利用互斥对象和事件对象这样的内核对......