用python实现Linux系统编程——进程

【笔记】linux 下python多进程启动程序 导入包from multiprocessing import Pool, cpu_count def split(tasks, core,list_count): """ 切分任务 """ each_part = math.ceil(list_count / core) + 1 parts = [] part = [] for index, ... 阅读详情

1.1多任务引入

生活中一般是多项事情同时进行,歌手唱歌、跳舞同时进行,用程序模拟唱歌、跳舞,代码如下:

import time

def sing():

forx in range(3):

print("正在唱歌。。。")

 

def dance():

fory in range(3):

print("正在跳舞。。。")

 

def main():

sing()

dance()

 

if __name__ =="__main__":

main()

<<15_1.py>>

但是输出的是先唱歌3次,再跳舞3次(并不是同时进行)

1.2多任务的概念

多任务:同时进行多项事务,对计算机操作系统而言,就是同时运行多个任务(程序),真正的并行多任务只能在多核CPU上实现,实际的计算任务量远超过CPU核心数,操作系统通过调度算法,将多任务分配给每个核心,单核cpu执行的时候是采用时间片轮转的方式运行多个任务

 
1.3进程的创建-fork

1.进程vs程序

进程:需要分配到时间片、在内存空间中、有程序代码、被CPU执行

程序:保存在磁盘上的一段代码

 

2.fork()

在Linux系统中可以调用系统fork()函数可以轻松创建进程

用fork()创建边唱歌、边跳舞的进程,示例代码:

import os,time

def sing():

forx in range(3):

print("正在唱歌%d"%x)

 

def dance():

fory in range(3):

print("正在跳舞%d"%y)

 

pid = os.fork()

if pid < 0:

print("fork调用失败!")

elif pid == 0:

print("进入子进程")

sing()

else:

print("进入父进程")

dance()

<<15_2.py>>

【注】os.fork()函数创建进程的时候先复制原有进程(父进程)到子进程,在父进程里返回值是创建的子进程的pid,在子进程里返回值是0,可以通过os.getpid()函数获取当前进程的pid,通过os.getppid()获取父进程的pid,调用一次,有两个返回值,fork()不能用于windows系统

 

示例代码:

import os

def main():

pid= os.fork()

ifpid < 0:

print("fork调用失败")

elifpid == 0:

print("进入子进程:")

print("当前进程pid=%d,父进程pid=%d"%(os.getpid(),os.getppid()))

print("在子进程中执行完毕")

else:

print("进入父进程执行")

print("当前进程的子进程pid=%d,父进程pid=%d"%(pid,os.getpid()))

print("父进程中运行完毕")

 

if __name__ =="__main__":

    main()

<<15_3.py>>

僵尸进程产生的原因:子进程运行结束,父进程尚未结束,并且未取回收子进程的资源就形成僵尸进程,僵尸进程保留这资源信息,以便父进程查找进程结束的原因

回收僵尸进程:在子进程后面调用os.wait()函数,os.wait()会阻塞父进程,(子进程没结束,父进程不会运行)

示例代码:(用fork产生僵尸进程)

import os

def main():

pid= os.fork()

ifpid < 0:

print("fork失败!")

elifpid == 0:

whileTrue:

print("进入子进程,子进程pid=%d,父进程是%d"%(os.getpid(),os.getppid()))

else:

print("进入父进程,父进程pid=%d,子进程pid=%d"%(os.getpid(),pid))

 

if __name__ =="__main__":

main()

<<fork产生僵尸进程.py>>

孤儿进程:子进程还在运行,父进程已经结束,就产生了孤儿进程,变成后台进程,不阻塞bash程序,不能接受用户输入,也不会相应用户输入

在ubuntu15.04版后图形界面情况下,孤儿进程都由upstart进程来接收,并成为它们的父进程,负责回收进程资源

在早期版本或命令行下是由1号init进程接收并回收资源

示例代码:(用fork产生孤儿进程)

import os

def main():

pid= os.fork()

ifpid < 0:

print("fork失败!")

elifpid == 0:

whileTrue:

print("进入子进程,子进程pid=%d,父进程pid=%d"%(os.getpid(),os.getppid()))

else:

print("进入父进程,父进程pid=%d,子进程pid=%d"%(os.getpid(),pid))

 

if __name__ =="__main__":

main()

<<fork产生孤儿进程.py>>

fork产生的子进程,在父进程没结束的情况下可以输入,父进程结束后子进程就变成孤儿进程,就不能接收输入报错

process产生的子进程,都不能接受输入,输入会报错,僵尸进程可以用join()回收

 

1.4.多进程修改全局变量

示例代码:

# -*- coding:utf-8-*-

import os

 

def work_add():

forx in range(5):

globalnum

num+= 1

print("全局变量num=%d"%num)

 

def work_minus():

fory in range(3):

         globalnum

         num-= 1

         print("全局变量num=%d"%num)

 

def main():

globalnum

num= 0

pid= os.fork()

ifpid < 0:

print("fork失败!")

elifpid == 0:

print("进入子进程")

work_add()

else:

print("进入父进程")

work_minus()

 

if __name__ =="__main__":

main()

<<fork修改全局变量.py>>

多进程中,每个进程中所有数据(包括全局变量)都各拥有一份,互不影响

 

1.5多次fork问题

2次fork示例代码:

# -*- coding:utf-8-*-

import os

pid1 = os.fork()

pid2 = os.fork()

 

print("pid1=%d,pid2=%d,getpid=%d,getppid=%d"%(pid1,pid2,os.getpid(),os.getppid()))

<<2次fork.py>>

fork()在父进程中返回值为产生的子进程的编号,在子进程中返回值为0,父子进程执行的顺序由操作系统的调度算法决定,不固定


1.6multiprocessing创建进程

fork()不支持windows系统,python是跨平台语言,要创建windows系统的多进程怎么办?

python内的multiprocessing模块里的Process类是一个创建多进程的类

1.Process类创建实例进程(子进程)时需要传入一个子类将要执行的函数(地址/函数名)和相应的参数,启动子进程用start方法

2.join()方法可以等待子进程运行结束后再继续往下运行,通常用于进程间的同步

Process语法结构:

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

  • target:表示这个进程实例所调用的对象;(要执行的任务,一般是函数名)
  • args:表示调用对象的参数元组;(x,)
  • kwargs:表示调用对象的关键字参数字典;
  • name:为当前进程实例的别名
  • group:大多情况下用不到

Process类常用方法

  • is_alive():判断进程实例是否还存在;
  • join([timeout]):是否等待进程实例执行结束,或等待多少秒;
  • start():启动进程实例(创建子进程);
  • run():如果没有给定target参数,对这个对象调用start()方法是,就将执行对象中的run()方法;
  • terminate():不管任务是否完成,立即终止;

Process类常用属性:

  • name:当前进程实例的别名,默认为Process-N,N为从1开始递增的整数;
  • pid:当前进程实例的pid值

process创建进程实例:(示例代码)

# -*- coding:utf-8-*-

from multiprocessingimport Process

import os

 

def work(num):

print("work进程%d开始运行,父进程为%d"%(os.getpid(),os.getppid()))

forx in range(num):

print("进程work运行%d次"%(x+1))

 

def main():

print("主进程%d开始运行"%os.getpid())

p= Process(target=work,args=(5,))

p.start()

p.join()

print("主进程运行结束")

if __name__ =="__main__":

main()

 

 

 

 

 

 

process创建进程实例,使用更多属性和方法:(示例代码)

 

# -*- coding:utf-8-*-

importos,time,random

from multiprocessingimport Process

def sing(name):

t_start= time.time()

forx in range(5):

print("进程%s开始执行,pid=%d"%(name,os.getpid()))

print("唱歌第%d次"%x)

time.sleep(random.random()*2)

t_end= time.time()

print("进程%s执行完毕,耗时%0.2f秒"%(name,t_end-t_start))

 

def dance(name):

t_start= time.time()

forx in range(5):

print("进程%s开始执行,pid=%d"%(name,os.getpid()))

print("跳舞第%d次"%x)

time.sleep(random.random()*2)

t_end= time.time()

print("进程%s执行完毕,耗时%0.2f秒"%(name,t_end-t_start))

 

def main():

p1 = Process(target=sing,args=("唱歌",))

p2 = Process(target=dance,name ="dance",args=("跳舞",))

 

 

p1.start()

p2.start()

 

p1.join()

p2.join()

 

print("p1进程运行结束,进程名:%s"%p1.name)

print("p2进程运行结束,进程名:%s"%p2.name)

 

if __name__ =="__main__":

main()

<<多process.py>>


1.7 Process子类创建进程

Process派生类创建子进程,自定义类通过继承Process就可以创建实例化进程

示例代码:

# -*- coding:utf-8-*-

import os,time

from multiprocessingimport Process

classMyProcess(Process):

def__init__(self,name):

Process.__init__(self)

self.name= name


defrun(self):

t_start= time.time()

print("进程%s开始运行,pid=%d"%(self.name,os.getpid()))

time.sleep(2)

t_end= time.time()

print("进程%s运行结束,耗时%0.2f秒"%(self.name,t_end-t_start))

 

def main():

myproc= MyProcess("myprocess")

myproc.start()

 

if __name__ =="__main__":

main()

<<process派生类.py>>

 

1.8.进程池Pool

利用multiprocessing的Process类可以动态创建进程,但是当任务量比较大的时候,创建、删除、又创建进程会消耗很多时间,利用multiprocessing模块里的Pool,可以先将一批进程创建好,执行任务的时候直接调用进程,当进程完成一项任务后又将进程返回到进程池中以备后用,可以提高工作效率

multiprocessing.Pool常用函数解析:

  • apply_async(func[,args[,kwargs]]):使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个继承退出才能执行下一个进程),args为传递给func的参数列表,kwargs为传递给func的关键字参数列表;
  • apply(func[,args[,kwargs]]):使用阻塞方式调用func
  • close():关闭Pool,使其不再接受新的任务;
  • terminate():不管任务是否完成,立即终止;
  • join():主进程阻塞,等待子进程的退出,必须再close或terminate之后使用;

 

使用进程池完成多进程任务,示例代码:

# -*-coding:utf-8 -*-

importos,time,random

from multiprocessingimport Pool

def work(num):

t_start= time.time()

print("子进程(%d)开始执行work任务%d"%(os.getpid(),num))

time.sleep(random.random()*2)

t_end= time.time()

print("子进程(%d)完成work任务%d,耗时:%0.2f秒"%(os.getpid(),num,t_end-t_start))

 

def main():

po= Pool(5)

 

forx in range(10):

po.apply_async(work,(x,))

po.close()

po.join()

 

if __name__ =="__main__":

main()

 

<<pool.py>>

 

1.9进程间通信-Queue

进程之间不能共享全局变量,但是进程之间经常需要通信,python的multiprocessing模块中提供了Queue机制(队列)实现进程间的通信

Queue使用说明

初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头);

Queue.qsize():返回当前队列包含的消息数量;

Queue.empty():如果队列为空,返回True,反之False;

Queue.full():如果队列满了,返回True,反之False;

Queue.get([block[,timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出"Queue.Empty"异常;

2)如果block值为False,消息列队如果为空,则会立刻抛出"Queue.Empty"异常;

Queue.get_nowait():相当Queue.get(False);

Queue.put(item,[block[,timeout]]):将item消息写入队列,block默认值为True;

1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full"异常;

2)如果block值为False,消息列队如果没有空间可写入,则会立刻抛出"Queue.Full"异常;

Queue.put_nowait(item):相当Queue.put(item,False);

Queue使用示例代码:

# -*- coding:utf-8-*-

import os,time

from multiprocessingimport Queue,Process

 

def writer(q,msg):

print("开始写入数据:")

forw in msg:

print(w)

ifnot q.full():

q.put(w)

else:

print("队列已满")

 

def reader(q):

print("开始读取消息:")

ifnot q.empty():

fory in range(q.qsize()):

r= q.get()

ifr == '#!#':

print("队列已空")

break

else:

print(r)

else:

print("队列已空")

 

def main():

msg = input("请输入要发送的消息(每个字以空格隔开):")

msg= list(msg.split(" "))

msg.append("#!#")

print(msg)

print("msg长度:%d"%len(msg))

qu= Queue(len(msg))

print(qu)

#po= Pool(4)

p1= Process(target = writer,args=(qu,msg))

p2= Process(target = reader,args=(qu,))

 

p1.start()

p1.join()

p2.start()

 

p2.join()

 

if __name__ =="__main__":

main()

 

<<queue1.py>>

 

进程池Pool里消息队列Queue

要使用Pool创建进程,就需要使用multiprocessing.Manger()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条错误信息:

RuntimeError: Queue objects should only be sharedbetween processes through inheritance.(运行时错误:Queue对象只能被通过继承产生的对象间共享)

示例代码:

# -*- coding:utf-8-*-

importtime,random,os

from multiprocessingimport Manager,Pool

defwriter(q,msg,id):

print("开始写入消息,进程%d,执行第%d部分任务"%(os.getpid(),id))

ifnot q.full():

forw in msg:

q.put(w)

else:

print("消息队列已满")

 

def reader(q,id):

print("开始读取消息,进程%d完成第%d部分任务"%(os.getpid(),id))

ifnot q.empty():

fory in range(q.qsize()):

r= q.get()

ifr == "#!#":

print("消息队列已空")

break

else:

print(r)

else:

print("消息队列已空")

 

def main():

msg = input("请输入要传送的消息(单词用空格隔开):")

print(msg)

msg= list(msg.split(" "))

msg.append("#!#")

print(msg)

po= Pool(4)

qu= Manager().Queue(len(msg))

forid in range (10):

po.apply_async(writer,(qu,msg,id))

po.apply_async(reader,(qu,id))

 

po.close()

po.join()

 

 

if __name__ =="__main__":

main()

<<pool_queue.py>>

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开! 摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提 阅读详情

相关推荐

ComfyUI的G-Dino模型加载器报错解决方案:从崩溃到重生

遇到G-Dino模型加载器报错不要慌,按照本文的步骤操作,99%的问题都能解决。模型文件正确下载到指定位置segment_anything节点安装完整且无冲突需要补充更多细节或故障排除方法吗?可以随时告诉我。

2301_78150483的博客 4023

python做Linux进程运行,Python实现在Linux系统下更改当前进程运行用户

在上一篇文章中,我们讲了如何在linux上用python写一个守护进程。主要原理是利用linux的fork函数来创建一个进程,然后退出父进程运行,生成的子进程就会成为一个守护进程。细心观察的可能会发现,这个守护进程的运行身份是执行这个程序的用户,如果把这个守护程序加入到系统的服务项,那么这个守护程序的执行身份应该是root。一个情况出现了,root的权限比较大,如果通过这个root身份的守护程序来...

weixin_39688170的博客 201

算力网:正在编织的“第二电网“

中国算力网:编织智能时代的"第二电网" 中国正在构建全国一体化算力网,目标让算力资源像水电一样即取即用。这一国家战略通过"东数西算"布局,将东部算力需求与西部清洁能源优势结合,形成三级时延圈(1ms城市级、5ms区域级、20ms国家级)。算力网采用三层架构:基础设施层的八大枢纽节点作为"发电厂",编排管理层的智能调度系统作为"调度中心",运营服务层提供标准化算力服务。关键技术包括算力路由、异构算力统一度量、无损网络和液冷技术等。

这只是一个博客 669

Linux系统下用python写程序,用Python写个Linux系统命令

这篇文章介绍如何写个系统命令以及我为什么要写命令“一切皆文件”是linux的基本哲学之一,我们在linux下执行的诸如ls之类的命令实际上都是去执行了系统上的某个文件,which命令可以查看到我们执行的命令对应的是系统上的哪个文件,例如常用的ls命令实际上就是执行了/bin/ls这个文件root@ops-coffee:~#whichls/bin/ls基于此,我们就知道了定义一个命令很简单,只需...

weixin_29331015的博客 451

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3679

ABAP 里的 XML 与 JSON 处理,一套从接口落地到 Clean Core 的完整参考

ABAP 里的 XML 和 JSON 处理并不只是几段工具类调用。iXML、sXML、、XCO、、code page conversion、GZIP、对象序列化,这些能力背后对应的是不同的数据规模、访问模式、接口契约和运行时边界。小报文、复杂树结构、需要修改节点,iXML 很顺手。大报文、顺序读写、内存敏感,sXML 更可靠。ABAP 结构和 XML、JSON 之间要做标准转换,是主干。现代 JSON API、ABAP Cloud、命名转换,XCO 值得优先考虑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

linux终端使用python_使用python中的子进程在linux终端上执行命令

I want to execute following command on linux terminal using python scripthg log -r "((last(tag())):(first(last(tag(),2))))" workThis command give changesets between last two tags who have affected fil...

weixin_39816448的博客 148

嵌入式通信协议框架的四层架构设计与实现

本文详细介绍一种模块化的嵌入式通信协议框架设计,采用四层架构:硬件抽象层统一管理数据收发与缓冲,隔离硬件差异;协议管理层通过特征识别自动路由多协议数据,支持动态扩展;协议处理层独立实现各协议解析/构建,确保校验安全与零拷贝效率;应用层采用表驱动模式处理业务逻辑,与协议细节解耦。 该架构已应用于工业控制等领域,具备强类型安全、高扩展性和平台无关性特点,显著提升复通信场景下的开发效率与系统可靠性。提供完整代码实现与设计要点分析,助力开发者构建高效通信栈。

Bit_Dong的博客 2464

Python对Linux系统的操作,打开文件与读写文件,python模拟linux的cp操作

cp操作请跳到第10节 1.open内建打开文件函数 作为打开文件的“钥匙”,内建函数open()提供了初始化输入/输出(I/O)操作的通用结接口 成功打开文件后会返回一个文件对象,如果打开失败会引发一个错误 示例: file_object = open(file_name,mode='r') file_object 是python的变量名用来保存文件对象 mode是打开的方式,以读...

ck784101777的博客 1万+

【新能源汽车测试工程师必看!DBC文件50条实战技巧,看懂这篇直接封神】

如果你是新能源汽车研发/测试工程师,还在为信号解析错误、报文找不到、DBC看不懂、实车故障复现不了头疼——那这篇文章,你一定要!在整车电控开发里,DBC = CAN总线的官方字典。没有DBC,报文就是一串乱码;读不懂DBC,测试寸步难行;用不好DBC,排查故障全靠猜。本文总结50条全网最实用、最贴近实车、最能解决问题的DBC技巧,从基础语法到新能源专用信号,从工具操作到故障排错,全部来自一线台架、实车、高压平台实战经验。不废话、不空谈、不玄学,全是能直接落地的硬货!

优快云-新能源汽车研发测试专业博主 1372

硬件基础知识-电机知识

步进电机存在空载启动频率,所以步进电机可以低速正常运转,但若高于一定速度时就无法启动,并伴有尖锐的啸叫声;在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。给电机两根线供电,电机就可以旋转,给正电压,电机正转,给相反电压,电机反转;电压越大,电机转得越快,电压越小,转速也变小。是一种直流电机,有刷电机的定子上安装有固定的主磁极和电刷,转子上安装有电枢绕组和换向器。控制器:使用专用的电子控制器来监测和控制电机的转速、电流和方向。线圈电流方向的交替变化是随电机转动的换相器和电刷来完成的。

weixin_46969363的博客 2296

python进程管理_Linux系统进程管理(Python)

psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID1)进程信息#列出所有进程PID>>> import psutil>>> psutil.pids()[1, 2, 3, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 25, 26, 27, 28, 36,...

weixin_30199989的博客 466

Autosar诊断实战系列05-Dcm之0x27加解密服务配置开发详解

UDS 0x27服务实战开发介绍,对解锁尝试次数及delay时间进一步解释。

initiallizer的博客 1993

python实现DEAMON守护进程

1 守护进程 1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。 在这里,我们在Linux2.6内核的centos中,ps -ef |awk '{print $1"\t “$2”\t “$3”\t "$8}'...

weixin_41986750的博客 3787

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python的多进程实现

Python的多进程实现

hungtaowu的博客 897

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Day10-2【Python 进程和线程】多进程编程:让Python程序“分身术”

你有没有想过,为什么我们可以同时在电脑上做很多事情,比如打开一个浏览器、听音乐、同时还有Word在忙着帮你排版?这就得归功于“多任务”的概念,但你知道吗,背后可有大大的“操作系统魔法”在支撑着呢!

max202011161630的博客 792

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python多进程

Python多进程fork子进程创建独立子进程使用进程池进程间通信 Python的线程因为解释器锁的设计,所以不能充分利用CPU,只能通过进程来实现多核利用 性能考虑的话,底层还是不要用Py,进程切换效率太低,Py多做为脚本层的胶水语言 fork子进程 如果是linux上,可以使用linux的fork函数创建子进程 在python里通过os模块调用linux的fork,可以直接生成一个与当前进程执行完fork语句后的状态一致的拷贝子进程 import os pid = os.fork() if pid==0

weixin_44627989的博客 210

python(进程和多进程)

Linux系统如何创建子进程 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用, 调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程( 称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork 出很多子进程,所以,父进程要记下每...

qq_43194257的博客 487

Python系统编程之进程

1、多任务概念 多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux就是一个支持多任务的操作系统,比起单任务系统它的功能增强了许多. 当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务。因为任务调度机制保证不同任务之间的切换速度十分...

weixin_34218890的博客 150

Python---多进程编程

多任务概念 多任务是指用户在用一时间运行多个应用程序,每个应用程序被称作一个任务。 当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务。因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。多任务系统中有3个功能单位:任务、进程和线程。 简单地说,就是操作系统可以同时运行多个任务。打个比...

zhihuiyu123的博客 441

进程与多进程的理解与实现

子进程和父进程 1). Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用, 调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程( 称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 2). 子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork 出很多子进程,所以,父进程要记下...

GLH_2236504154的博客 471

Linux中不同进程同一个端口,linux系统实现多个进程监听同一个端口

通过 fork 创建子进程的方式可以实现父子进程监听相同的端口。方法:在绑定端口号(bind函数)之后,监听端口号之前(listen函数),用fork()函数生成子进程,这样子进程就可以克隆父进程,达到监听同一个端口的目的。# 代码示例:一主一子import socketimport selectimport sysimport structimport osimport timeif __nam...

weixin_32371243的博客 1619

Python网络编程(子进程的创建与处理、简单群聊工具)

&#13;   前言: 昨天我们已经了解了多进程的原理以及它的实际使用 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次, 但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 子进程永远返回0,而父进程返回子进程的ID。这...

ParisGabriel 273

的核数和进程_【Python学习笔记】57、多进程

要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。这样做...

weixin_29732787的博客 153

Python fork方法:创建新进程

在实际编程中,程序可通过 fork() 方法来创建一个子进程,然后通过判断 fork() 方法的返回值来确定程序是否正在执行子进程,也就是把需要并发执行的任务放在 if pid==0: 的条件执行体中,这样就可以启动多个子进程来执行并发任务。print('子进程,其ID为 (%s), 父进程ID为 (%s)' % (os.getpid(), os.getppid()))print('我 (%s) 创建的子进程ID为 (%s).' % (os.getpid(), pid))# 如果pid为0,表明子进程。

hakesashou的博客 554

multiprocessing python_Python教程:进程和线程&多进程

要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。这样做...

weixin_39928787的博客 74
下一篇: CentOS7 yum安装的rh-python3.8升级pip后报错ModuleNotFoundError: No module named ‘pip’ 修复
flash_star
博客等级 码龄15年 2粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值