Python系统编程--进程

Win11内核隔离无法打开的解决方案详解 内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。 阅读详情

1. 多任务的引入

在现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的,试想,如果把唱歌和跳舞这2件事情分开依次完成的话,估计就没有那么好的效果了。

示例:模拟唱歌跳舞

from time import sleep

def sing():
    for i in range(3):
        print("正在唱歌...%d"%i)
        sleep(1)

def dance():
    for i in range(3):
        print("正在跳舞...%d"%i)
        sleep(1)

if __name__ == '__main__':
    sing() #唱歌
    dance() #跳舞

运行结果:

正在唱歌...0
正在唱歌...1
正在唱歌...2
正在跳舞...0
正在跳舞...1
正在跳舞...2

注意:
 • 很显然刚刚的程序并没有完成唱歌和跳舞同时进行的要求
 • 如果想要实现“唱歌跳舞”同时进行,那么就需要一个新的方法,叫做:多任务

2. 多任务的概念

什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。

现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?

答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

3. 进程的创建

3.1 进程VS程序

编写完毕的代码,在没有运行的时候,称之为程序。
正在运行着的代码,就成为进程。
进程除了包含代码以外,还有需要运行的环境等,所以和程序是有区别的。

3.2 fork()

Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:

import os

# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()

if pid == 0:
    print('哈哈1')
else:
    print('哈哈2')

说明:
• 程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中

• 然后父进程和子进程都会从fork()函数中得到一个返回值,在子进程中这个值一定是0,而父进程中是子进程的 id号

• 在Unix/Linux操作系统中,提供了一个fork()系统函数,它非常特殊。

• 普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

• 子进程永远返回0,而父进程返回子进程的ID。

• 这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

4. getpid(),getppid()

示例:

import os

rpid = os.fork()
if rpid<0:
    print("fork调用失败。")
elif rpid == 0:
    print("我是子进程(%s),我的父进程是(%s)"%(os.getpid(),os.getppid()))
    x+=1
else:
    print("我是父进程(%s),我的子进程是(%s)"%(os.getpid(),rpid))

print("父子进程都可以执行这里的代码")

运行结果:

我是父进程(19360),我的子进程是(19361)
父子进程都可以执行这里的代码
我是子进程(19361),我的父进程是(19360)
父子进程都可以执行这里的代码

5. 多进程修改全局变量

示例:

import os
import time

num = 0

# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()

if pid == 0:
    num+=1
    print('哈哈1---num=%d'%num)
else:
    time.sleep(1)
    num+=1
    print('哈哈2---num=%d'%num)

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

6. 多次fork问题

import os
import time
pid=os.fork()
num=1
if pid==0:
        num+=2
        print('haha1...pid=%s,ppid=%s,num=%s'%(os.getpid(),os.getppid(),num))
else:
        num+=1
        print('haha2...pid=%s,ppid=%s,num=%s'%(os.getpid(),os.getppid(),num))

pid=os.fork()
if pid==0:
        time.sleep(3)
        print('haha3...pid=%s,ppid=%s,num=%s'%(os.getpid(),os.getppid(),num))
else:
        print('haha4...pid=%s,ppid=%s,num=%s'%(os.getpid(),os.getppid(),num))

运行结果:
这里写图片描述

7. multiprocessing

如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?

由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:

from multiprocessing import Process
import os

# 子进程要执行的代码
def run_proc(name):
    print('子进程运行中,name= %s ,pid=%d...' % (name, os.getpid()))

if __name__=='__main__':
    print('父进程 %d.' % os.getpid())
    p = Process(target=run_proc, args=('test',))
    print('子进程将要执行')
    p.start()
    p.join()
    print('子进程已结束')

运行结果:

父进程 6036.
子进程将要执行
子进程运行中,name= test ,pid=1240...
子进程已结束

说明:
• 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,这样创建进程比fork()还要简单。
• join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。

Process语法结构如下:

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

• target:表示这个进程实例所调用对象;
• args:表示调用对象的位置参数元组;
• kwargs:表示调用对象的关键字参数字典;
• name:为当前进程实例的别名;
• group:大多数情况下用不到;

Process类常用方法:
• is_alive():判断进程实例是否还在执行;

• join([timeout]):是否等待进程实例执行结束,或等待多少秒;

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

• run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;

• terminate():不管任务是否完成,立即终止;
Process类常用属性:

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

• pid:当前进程实例的PID值;

示例1:

from multiprocessing import Process
import os
from time import sleep

# 子进程要执行的代码
def run_proc(name, age, **kwargs):
    for i in range(10):
        print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age,os.getpid()))
        print(kwargs)
        sleep(0.5)

if __name__=='__main__':
    print('父进程 %d.' % os.getpid())
    p = Process(target=run_proc, args=('test',18), kwargs={"m":20})
    print('子进程将要执行')
    p.start()
    sleep(1)
    p.terminate()
    p.join()
    print('子进程已结束')

运行结果:

父进程 5428.
子进程将要执行
子进程运行中,name= test,age=18 ,pid=2688...
{'m': 20}
子进程运行中,name= test,age=18 ,pid=2688...
{'m': 20}
子进程已结束

示例2:

from multiprocessing import Process
import time
import os

#两个子进程将会调用的两个方法
def  worker_1(interval):
    print("worker_1,父进程(%s),当前进程(%s)"%(os.getppid(),os.getpid()))
    t_start = time.time()
    time.sleep(interval) #程序将会被挂起interval秒
    t_end = time.time()
    print("worker_1,执行时间为'%0.2f'秒"%(t_end - t_start))

def  worker_2(interval):
    print("worker_2,父进程(%s),当前进程(%s)"%(os.getppid(),os.getpid()))
    t_start = time.time()
    time.sleep(interval)
    t_end = time.time()
    print("worker_2,执行时间为'%0.2f'秒"%(t_end - t_start))


if __name__ == '__main__':

    #输出当前程序的ID
    print("进程ID:%s"%os.getpid())

    #创建两个进程对象,target指向这个进程对象要执行的对象名称,
    #args后面的元组中,是要传递给worker_1方法的参数,
    #因为worker_1方法就一个interval参数,这里传递一个整数2给它,
    #如果不指定name参数,默认的进程对象名称为Process-N,N为一个递增的整数
    p1=Process(target=worker_1,args=(2,))
    p2=Process(target=worker_2,name="yongGe",args=(1,))

    #使用"进程对象名称.start()"来创建并执行一个子进程,
    #这两个进程对象在start后,就会分别去执行worker_1和worker_2方法中的内容
    p1.start()
    p2.start()

    #同时父进程仍然往下执行,如果p2进程还在执行,将会返回True
    print("p2.is_alive=%s"%p2.is_alive())

    #输出p1和p2进程的别名和pid
    print("p1.name=%s"%p1.name)
    print("p1.pid=%s"%p1.pid)
    print("p2.name=%s"%p2.name)
    print("p2.pid=%s"%p2.pid)

    #join括号中不携带参数,表示父进程在这个位置要等待p1进程执行完成后,
    #再继续执行下面的语句,一般用于进程间的数据同步,如果不写这一句,
    #下面的is_alive判断将会是True,在shell(cmd)里面调用这个程序时
    #可以完整的看到这个过程,大家可以尝试着将下面的这条语句改成p1.join(1),
    #因为p2需要2秒以上才可能执行完成,父进程等待1秒很可能不能让p1完全执行完成,
    #所以下面的print会输出True,即p1仍然在执行
    p1.join()
    print("p1.is_alive=%s"%p1.is_alive())

运行结果:

进程ID:2708
p2.is_alive=True
p1.name=Process-1
p1.pid=6612
p2.name=yongGe
p2.pid=5044
worker_1,父进程(2708),当前进程(6612)
worker_2,父进程(2708),当前进程(5044)
worker_2,执行时间为'1.00'秒
worker_1,执行时间为'2.00'秒
p1.is_alive=False

8. 进程的创建-Process子类

创建新的进程还能够使用类的方式,可以自定义一个类,继承Process类,每次实例化这个类的时候,就等同于实例化一个进程对象。
示例:

from multiprocessing import Process
import time
import os

#继承Process类
class Process_Class(Process):
    #因为Process类本身也有__init__方法,这个子类相当于重写了这个方法,
    #但这样就会带来一个问题,我们并没有完全的初始化一个Process类,所以就不能使用从这个类继承的一些方法和属性,
    #最好的方法就是将继承类本身传递给Process.__init__方法,完成这些初始化操作
    def __init__(self,interval):
        Process.__init__(self)
        self.interval = interval

    #重写了Process类的run()方法
    def run(self):
        print("子进程(%s) 开始执行,父进程为(%s)"%(os.getpid(),os.getppid()))
        t_start = time.time()
        time.sleep(self.interval)
        t_stop = time.time()
        print("(%s)执行结束,耗时%0.2f秒"%(os.getpid(),t_stop-t_start))

if __name__=="__main__":
    t_start = time.time()
    print("当前程序进程(%s)"%os.getpid())        
    p1 = Process_Class(2)
    #对一个不包含target属性的Process类执行start()方法,就会运行这个类中的run()方法,所以这里会执行p1.run()
    p1.start()
    p1.join()
    t_stop = time.time()
    print("(%s)执行结束,耗时%0.2f"%(os.getpid(),t_stop-t_start))

运行结果:

当前程序进程(5292)
子进程(5784) 开始执行,父进程为(5292)
(5784)执行结束,耗时2.00秒
(5292)执行结束,耗时2.16

总结:

创建进程的两种方法对比:
1.方法
2.继承
继承类是以面向对象考虑这个事的,所以业务逻辑复杂,建议使用继承类,更好理解。

9. 进程池Pool

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行。

示例1:

from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d"%(msg,os.getpid()))
    #random.random()随机生成0~1之间的浮点数
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start))
if __name__ == '__main__':

    po=Pool(3) #定义一个进程池,最大进程数3
    for i in range(0,10):
        #Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))
        #每次循环将会用空闲出来的子进程去调用目标
        po.apply_async(worker,(i,))

    print("----start----")
    po.close() #关闭进程池,关闭后po不再接收新的请求
    po.join() #等待po中所有子进程执行完成,必须放在close语句之后
    print("-----end-----")

运行结果:

----start----
0开始执行,进程号为4440
1开始执行,进程号为6312
2开始执行,进程号为6792
2 执行完毕,耗时0.43
3开始执行,进程号为6792
3 执行完毕,耗时0.15
4开始执行,进程号为6792
1 执行完毕,耗时0.60
5开始执行,进程号为6312
5 执行完毕,耗时0.10
6开始执行,进程号为6312
6 执行完毕,耗时0.29
7开始执行,进程号为6312
0 执行完毕,耗时1.33
8开始执行,进程号为4440
8 执行完毕,耗时0.24
9开始执行,进程号为4440
7 执行完毕,耗时0.79
4 执行完毕,耗时1.23
9 执行完毕,耗时1.60
-----end-----

总结:
进程池里的任务不需要自己start()
进程池里的任务,不是按照放入的顺序的执行的
哪个进程执行哪个任务,不能人为手动干预

1、第一步:设置进程池中进程的数量
进程池的数字根据硬件环境进行设定,一般设置为cpu的数量
2、第二步:放任务
3、第三步:关闭进程池 close
4、第四步:开始干活, join
进程池中的进程开始执行任务
如果任务大于进程的数量,多余的任务等待
一旦某个进程完成当下的任务,从等待的任务中随机找一个任务执行。

multiprocessing.Pool常用函数解析:

apply()

apply(func[, args=()[, kwds={}]])

该函数用于传递不定参数,使用阻塞方式调用func,主进程会被阻塞直到函数执行结束

apply_async()

apply_async(func[, args[, kwds]])

使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表

close()
关闭Pool,使其不再接受新的任务

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

join()
主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用

示例2:apply堵塞式

from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d"%(msg,os.getpid()))
    #random.random()随机生成0~1之间的浮点数
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start))

if __name__ == '__main__':

    po=Pool(3) #定义一个进程池,最大进程数3
    for i in range(0,10):
        po.apply(worker,(i,))

    print("----start----")
    po.close() #关闭进程池,关闭后po不再接收新的请求
    po.join() #等待po中所有子进程执行完成,必须放在close语句之后
    print("-----end-----")

运行结果:

0开始执行,进程号为5960
0 执行完毕,耗时0.17
1开始执行,进程号为3208
1 执行完毕,耗时0.03
2开始执行,进程号为6312
2 执行完毕,耗时0.20
3开始执行,进程号为5960
3 执行完毕,耗时0.61
4开始执行,进程号为3208
4 执行完毕,耗时1.39
5开始执行,进程号为6312
5 执行完毕,耗时0.46
6开始执行,进程号为5960
6 执行完毕,耗时1.36
7开始执行,进程号为3208
7 执行完毕,耗时0.03
8开始执行,进程号为6312
8 执行完毕,耗时0.45
9开始执行,进程号为5960
9 执行完毕,耗时1.11
----start----
-----end-----

10. 进程间的通信-Queue

Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。

10.1 Queue的使用

可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理:

from multiprocessing import Queue
q=Queue(3) #初始化一个Queue对象,最多可接收三条put消息
q.put("消息1")
q.put("消息2")
print(q.full())  #False
q.put("消息3")
print(q.full()) #True

#因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常
try:
    q.put("消息4",True,2)
except:
    print("消息列队已满,现有消息数量:%s"%q.qsize())

try:
    q.put_nowait("消息4")
except:
    print("消息列队已满,现有消息数量:%s"%q.qsize())

#推荐的方式,先判断消息列队是否已满,再写入
if not q.full():
    q.put_nowait("消息4")

#读取消息时,先判断消息列队是否为空,再读取
if not q.empty():
    for i in range(q.qsize()):
        print(q.get_nowait())

运行结果:

False
True
消息列队已满,现有消息数量:3
消息列队已满,现有消息数量:3
消息1
消息2
消息3

说明:
初始化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);

10.2 Queue示例

注意参数的传递
我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

from multiprocessing import Process, Queue
import os, time, random

# 写数据进程执行的代码:
def write(q):
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())

# 读数据进程执行的代码:
def read(q):
    while True:
        if not q.empty():
            value = q.get(True)
            print('Get %s from queue.' % value)
            time.sleep(random.random())
        else:
            break

if __name__=='__main__':
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()
    # 等待pw结束:
    pw.join()
    # 启动子进程pr,读取:
    pr.start()
    pr.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    print('所有数据都写入并且读完')

运行结果:

Put A to queue...
Put B to queue...
Put C to queue...
Get A from queue.
Get B from queue.
Get C from queue.
所有数据都写入并且读完

10.3 进程池中的Queue

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

RuntimeError: Queue objects should only be shared between processes through inheritance.

示例:进程池中的进程如何通信

from multiprocessing import Manager,Pool
import os,time,random

def reader(q):
    print("reader启动(%s),父进程为(%s)"%(os.getpid(),os.getppid()))
    for i in range(q.qsize()):
        print("reader从Queue获取到消息:%s"%q.get(True))

def writer(q):
    print("writer启动(%s),父进程为(%s)"%(os.getpid(),os.getppid()))
    for i in "yongGe":
        q.put(i)

if __name__=="__main__":
    print("(%s) start"%os.getpid())
    q=Manager().Queue() #使用Manager中的Queue来初始化
    po=Pool()
    #使用阻塞模式创建进程,这样就不需要在reader中使用死循环了,可以让writer完全执行完成后,再用reader去读取
    po.apply(writer,(q,))
    po.apply(reader,(q,))
    po.close()
    po.join()
    print("(%s) End"%os.getpid())

运行结果:

(2672) start
writer启动(4100),父进程为(2672)
reader启动(2732),父进程为(2672)
reader从Queue获取到消息:y
reader从Queue获取到消息:o
reader从Queue获取到消息:n
reader从Queue获取到消息:g
reader从Queue获取到消息:G
reader从Queue获取到消息:e
(2672) End
Python re库【正则表达式操作库】全面讲解及代码示例 以下是Pythonre库的全面讲解,包含主要功能、常用方法及代码示例。完整代码和注释附后。正则表达式(Regular Expression)是用于匹配、查找、替换字符串的工具,通过特定语法定义模式。?{n}[...][a-z]A|B\d[0-9]\D\s\S\w\Wre从字符串匹配模式,返回Match对象或None。在字符串中第一个匹配项,返回Match对象或None。返回所有匹配项的。返回所有匹配项的Match对象)。替换匹配项,返回新字符串。根据模式分割字符串,返回列表。通过。 阅读详情

相关推荐

HA集群 执行 hdfs haadmin -transitionToActive 失败

最近把一个单NameNode集群变更为HA集群,过程中都很顺利,nn1和nn2两个NameNode都显示standby状态,但是把nn1或者nn2切换到active状态时就会报错抛异常。 查看master上namenode启动日志,如下: Incompatible clusterID for journal Storage Directory /home/hadoop-zero/bigdat...

qq_34727158的博客 1763

Python 之小白的系统进程的理解之fork篇

系统编程介绍:之前程序执⾏都是⼀条腿⾛路,甚⾄是⽤⼀杆枪来打天下,通过系统编程的学习,会让大家有“”多条腿“”一起走路,就好比有了一把机关枪。进程现实生活中:      有很多的场景中的事情是同时进⾏的,⽐如开⻋的时候 ⼿和脚共同来驾驶汽⻋,再⽐如唱歌跳舞也是同时进⾏的;试想,如果把唱歌和跳舞这2件事情分开依次完成的话,估计就没有那么好的效果了(想⼀下场景:先唱歌,然后在跳舞,O(∩_∩)O哈哈~...

Mr_zhang的博客 429

VXLAN技术详解

VXLAN(虚拟可扩展局域网)是一种Overlay二层虚拟化技术,通过MAC-in-UDP封装在IP网络上构建大规模虚拟二层网络。核心组件包括VTEP(隧道端点)、24位VNI(支持1600万个虚拟网络)和VXLAN网关。相比VLAN,VXLAN具有超大规模扩展、跨三层互联、支持虚拟机无缝迁移等优势,适用于云数据中心多租户隔离、跨数据中心互联等场景。其基于IP路由的封装方式无需改造物理网络,为现代云网络提供了弹性、安全的虚拟化解决方案。

kjkdd的博客 595

操作系统——sjf算法python实现

python源码: 代码: # --*-- coding:utf-8 --*-- # python3.5 import time pcb = [] # 列表保存进程 # 输入函数 def InPcb(): # n 计数读取的行数 n = 0 print("读取的文本内容为......") with open("pcb.txt") a...

Growing_hacker的博客 2892

实测有效!易灵思FPGA工程如何正确配置Efinity+Modelsim仿真环境

本文详细介绍了易灵思FPGA工程中如何高效配置Efinity与Modelsim联合仿真环境,包括软件版本匹配、系统环境变量设置、工程文件结构优化及仿真脚本深度优化等实战经验。通过实测数据验证,该方案可显著提升仿真效率,适用于不同规模的设计验证,帮助工程师快速搭建稳定高效的联仿环境。

m2n3b4v5c6的博客 405

基于Spring Boot 3 + Vue 3 + Vite的现代化社区订餐系统设计与实现

本文将详细阐述系统的整体架构、数据库设计、核心功能模块(用户管理、餐厅管理、菜品浏览、购物车、订单管理)的实现细节,并提供关键代码示例。<el-input v-model="loginForm.password" type="password" placeholder="密码" prefix-icon="Lock" show-password />.requestMatchers("/api/auth/**", "/api/dishes/public/**").permitAll() // 公开接口。

2201_76125393的博客 468

操作系统——进程调度算法 python实现

文章目录一、实验内容(1)优先权法、轮转法(2) 算法描述二、流程图(1)优先权法——动态优先级(2)轮转法(RR法)三、实验分析四、完整代码及输出(1)代码(2)输出 一、实验内容 (1)优先权法、轮转法 简化假设 1) 进程为计算型的(无I/O) 2) 进程状态:ready、running、finish 3) 进程需要的CPU时间以时间片为单位确定 (2) 算法描述 1) 优先权法——动态优先权 当前运行进程用完时间片后,其优先权减去一个常数。 2) 轮转法 二、流程图 (1)优先权法——动态优先级

kindness_Chen的博客 1万+

AutoSAR实验视频讲解:相关资料下载

AutoSAR实验视频讲解:闪烁一颗LED实验【相关资料下载】 总目录 为了方便大家自己的实验顺利进行,这里我们准备了一些实验中可能用到的资料供大家使用 介绍 这里主要是三个文件: MyApp_Core.0是我们的用户代码,在工程集成那集将会讲解 McalConfig.arxml就是我们的Mcal导出文件,用于导入到DaVinci中生成代码 CAN.dbc文件是我们的通信矩阵文件 以上几个文件都是简单的配置,不具有实际项目的实用性,大家仅供参考 // 顺便吐槽一句:百度网盘的吃相真的难看 下载连接

雪云飞星的博客 6668

day 37 并发编程和操作系统的发展史 + 进程

python之路——操作系统的发展史 阅读目录   手工操作 —— 穿孔卡片   批处理 —— 磁带存储和批处理系统   多道程序系统   分时系统   实时系统   通用操作系统   操作系统的进一步发展   操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式。...

weixin_30633507的博客 214

OpenClaw实战三|电商自动化AI工具:自动上下架+智能客服+订单统计,小店运营效率直接翻3倍

对电商小团队、夫妻店、个人商家来说,最缺的不是流量,而是省时间的工具。OpenClaw这套电商自动化AI工具,不用懂代码、不用买昂贵的SaaS软件,一台服务器、简单配置,就能把最耗时间的工作全部交给AI。人只做最有价值的事:选品、拍图、搞流量、处理复杂售后,剩下的上下架、回复、统计,全都让AI帮你打工。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1459

【Coze】在Coze平台使用源码创建工作流

Coze平台提供低代码工作流搭建功能,支持通过图形化界面快速构建自动化任务流程。用户可通过资源库创建工作流,导入JSON配置生成节点结构,连接起始节点并配置输入/输出字段(需定义数据类型)。平台提供试运行功能验证流程执行,支持可视化调试与发布上线。该方案适用于快速部署标准化业务逻辑,实现端到端的自动化处理。

Mr数据杨 2430

Python系统编程之进程

1,何为进程? 我们可以理解为:每一个任务都是一个进程。 打个比方,一在个视频,唱歌和跳舞这2件事情分别就是两个任务,如果是单个进程单个线程的话,理论上也就是在唱歌的时候不能跳舞,跳舞的时候不能唱歌,这是不是很尴尬。所以,我们一般来说,都希望能同时运行多个进程多个线程。线程我们暂且不讲,接下来讲下进程。 2,进程跟CPU的关系 一般来说,单核的CPU只有一个进程。但为什么我们也能看到单...

某嫌疑犯 301

某城商银行生产容器云平台详细设计方案分享及经验总结

AS3模式的CIS容器部署在K8S集群内,作为F5的控制器,CIS容器通过对K8S集群内Configmap资源进行监控,将Configmap资源中的内容转化为F5的配置,将配置推送给 F5 ,CIS容器还通过K8S标准的API接口完成业务发现和实时监听集群内Pod的变化,一旦Pod发生变化,相应的更新会及时推送给F5,并完成更新。容器技术发展非常迅速,现在应用大多以容器作为承载介质,前两年在容器云上承载的应用类型主要是Web类,随着容器云领域的不断发展,越来越多的应用类型将迁移至容器云,包括有状态应用。

qq_61890005的博客 856

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

1.1多任务引入 生活中一般是多项事情同时进行,歌手唱歌、跳舞同时进行,用程序模拟唱歌、跳舞,代码如下: import time def sing(): forx in range(3): print("正在唱歌。。。")   def dance(): fory in range(3): print("正在跳舞。。。")   def main(): sing()

flash_star的博客 922

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【python系统编程1】多进程

【python系统编程1】多进程1 进程的含义1.1 程序、进程与线程的管理1.2 多进程的运行原理1.3 并发与并行1.4 pid和ppid2 Process类2.1 入门案例2.2 传递参数2.3 常用方法与属性2.4 pid和ppid2.5 类进程2.6 Process进程通信2.6.1 进程通信的问题2.6.2 简单的通信案例2.6.3 队列的常用方法与参数2.7 Process进程的生命...

kzl_knight的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

进程,操作系统,Python并发编程之多进程

1.进程基础知识 1.程序:若干文件 2.进程:一个正在执行的文件,程序 3.进程被谁执行:cpu最终运行指定的程序 4.操作系统调度作用:将磁盘上的程序加载到内存,然后交由CPU去处理,一个CPU正在运行的一个程序,就叫开启了一个进程 2.操作系统 1.操作系统:存在于硬盘与软件之间,管理、协调、控制软件与硬件的交互 2.操作系统的作用:将一些复杂的硬件封装成简单的借口,便于使用;合...

weixin_30725315的博客 90

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python 操作进程_Python系统编程-进程

1.进程1.多任务的引入有很多的场景中的事情是同时进行的,比如开车的时候手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;运行结果:·此时显然刚刚的程序并没有完成唱歌和跳舞同时进行的要求·如果想要实现“唱歌跳舞”同时进行,那么就需要一个新的方法,叫做:多任务2.多任务的概念多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux、windows就是支持多任务的操...

weixin_39621695的博客 195

python3 系统编程——进程

使用process模块创建进程 from multiprocessing import Process def f(name): print('hello', name) print('我是子进程') if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() ...

311宿舍 319

python系统编程篇之进程

python系统编程篇之进程 进程与程序的概念问题 编写完毕的代码,在没有运行的时候,称为程序 正在运行的代码,是进程 进程,不只是正在运行的代码,还有需要的运行环境 区分程序与进程,这两个概念是很重要的 fork 运用fork(),可以创建子进程。但是需要注意的是,fork()只能在mac,linux,UNIX系统上使用,而在windows中是不能使用的 import os r...

peterblackas的博客 267

Python系统编程1:进程

第一章 进程 1.1. 多任务的引入 1.2. 多任务的概念 1.3. 进程的创建-fork 1.4. 多进程修改全局变量 1.5. 多次fork问题 1.6. 进程的创建-multiprocessing 1.7. 进程的创建-Process子类 1.8. 进程池Pool 1.9. 进程间通信-Queue 1.1. 多任务的引入进程 现实生活中 有很多的场景中的事情是同时进行的,比

laststom的博客 605

python系统编程指令_python之系统编程 --进程

1.调试(PDB)代码:[root@master gaoji]#vim test2.py1 #!/usr/local/bin/python32 #-*- coding:utf-8 -*-34 defgetAverage(a,b):5 result = a +b6 print("result=%d" %result)7 returnresult89 a = 10010 b =...

weixin_39541212的博客 113

python系统编程模块_Python系统进程管理模块

模块:psutilpsutil是一个跨平台库,可以很轻松的为我们实现获取系统运行的进程和资源利用率等信息。功能:主要是为了系统监控安装:wgethttps://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz--no-check-certificatetar-zxvfpsutil-2.0.0.tar.gzcdpsut...

weixin_39844525的博客 92

python3 系统编程进程

进程的创建-fork     进程vs程序   编写完毕的代码,在没有运行的时候,称之为程序。   正在运行着的代码,就称为进程。进程除包含代码以外,还有需要运行的环境等,所以和程序是有区别的。   fork()   Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:   说明:   程序执行到os.fork()时,操...

weixin_34376562的博客 127

Python系统编程---进程

进程 功能一个进程就是一个任务,通过多进程能够实现多任务的执行。换句话说,多任务的需求,能:够通过多进程来满足。 定义:代码程序运行起来,就是进程,执行过程中创建的变量、消耗的内存空间等等统称为进程。 注意: 底层中,不同的操作系统对进程的处理顺序等是不同的。 进程之间数据是不共享的 一、创建经常的三种方法,以及他们的区别 1.unixt系统的底层fork()进程 父进程、子进程执行顺序没有...

weixin_43213607的博客 142

【python核心编程】系统编程--进程

目录 一、进程 1、fork 1.1 fork基本用法 1.2fork 执行顺序问题 1.3fork 多进程修改全局变量 1.4多次fork问题 1.5fork 总结 2、processing 2.1Process基本用法          2.2进程的创建-Process子类 3、进程池Pool 3.1Pool基本用法 4、进程间通信-Queue        4.1...

阿俊的博客 579
上一篇: Python高级编程--元类
下一篇: Python系统编程--线程
rongtingYan
博客等级 码龄10年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值