Linux 编程 进程 学习笔记 小案例

多任务

生活中的多任务:

有很多的场景中的事情是同时进行的,例如

1.开车的时候 手和脚共同来驾驶汽车,还一边听着音乐

2.再比如唱歌跳舞也是同时进行的;....

程序中的多任务

 
 
# 吃饭
def eat():
   for i in range(3):
      print("吃饭..", i)
      yield None


# 打电话
def call_up():
   for i in range(3):
      print("打电话..", i)
      yield None


if __name__ == "__main__":
   e = eat()
   c = call_up()
try:
   while True:
      e.__next__()
      c.__next__()
except Exception as result:
   print(result)

#结果
# 吃饭.. 0
# 打电话.. 0
# 吃饭.. 1
# 打电话.. 1
# 吃饭.. 2
# 打电话.. 2


如果有多件事情是同时进行,我们把这种情况叫做多任务Linux 是真正的多任务、多用户操作系统,windows是多任务操作系统,但不是真正意义上的多用户操作系统。

多任务在程序中的实现--进程和线程

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

并发:两个或多个事件在同一时间间隔内发生

并行:两个或多个事件在同一时刻发生

多任务:(进程)操作系统可以同时运行多个任务

os.fork函数创建进程

Python的os模块封装了常见的系统调用,前面我们使用os模块中的os.mkdir()创建目录,其中就包括os.fork(),可以在Python程序中轻松创建子进程,并且实现多任务,但是在windows上无法创建成功。

 
 
import os
import time

print("-----11111----")
pid = os.fork()  # 返回值: ==0 子进程      >0 父进程
print("----22222----")

if pid == 0:
   print("-----33333---")
   print("子进程:pid:", pid)

elif pid > 0:
   time.sleep(0.1)
   print("-----44444---")
   print("父进程:pid:", pid)

else:
   print("-----55555---")
   print("创建进程失败!")


总结:

1.代码从上往下执行到os.fork()时,python的会调用操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中,然后父进程和子进程都会从fork()函数中得到一个返回值,在子进程中这个值一定是0,而父进程中返回的是刚好子进程的 id号。

2.Unix/Linuxwindows不支持)操作系统中,提供了一个fork()系统函数,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回

 3.子进程永远返回0,而父进程返回子进程的ID,这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID,getpid()得到当前进程的ID。

 4. 父进程和子进程那个先执行:这个跟操作系统调度有关,不一定那个先执行。

5. Linux创建进程最多达到65535个,进程号不能相同的,如果已经存在,就往后去找对应的数做进程号,最多端口也是和进程创建数也差不多,一个进程对应有一个端口号。

进程之间的数据不共享

import os
import time


count = 0
number = 100


print("-----11111----")


pid = os.fork()




class Person:
	pass




person = Person()  # person就是对象类型


if pid == 0:
	for i in range(5):
		count += 1
		number -= 1
	person.name = "小黑-子"
	print("子进程中count的值:%d,number的值:%d,Person对象:%s" % (id(count), id(number), id(person)))
elif pid > 0:
	for i in range(5):
		count += 1
		number -= 1
	person.name = "小白-父"
	time.sleep(1)
	print("父进程中count的值:%d,number的值:%d,Person对象:%s" % (id(count), id(number), id(person)))
else:
	print("---game over--")


print(pid, "====>", person.name)



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

fork时子进程获得父进程代码和数据段、共享库、堆和栈的拷贝所以变量的地址也是一样的,并且在某一个进程中修改相同变量的值,在另外一个进程中的相同变量的值不会修改。



猜你喜欢

转载自blog.csdn.net/antian1991/article/details/80368823
今日推荐