认识进程和线程

1.创建进程

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

import os
    pid = os.fork #注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
    if pid == 0:
        print("哈哈1")
    else:
        print("哈哈2")

2.getpid
普通函数调用一次,只返回一次。fork函数调用一次可以返回两次。所以操作系统会自己把当前程序默认为'父进程'.
子进程只需要调用getppid()就可以拿到父进程的ID。

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("父子进程都可以执行这里的代码")

3.进程的创建-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))

2.线程

  1. 使用threading模块
    (1) 单线程执行
#coding=utf-8
import time

def saySorry():
    print("亲爱的,我错了,我能吃饭了吗?")
    time.sleep(1)

if __name__ == "__main__":
    for i in range(5):
        saySorry()

(2) 多线程执行

#coding=utf-8
import threading
import time

def saySorry():
    print("亲爱的,我错了,我能吃饭了吗?")
    time.sleep(1)

if __name__ == "__main__":
    for i in range(5):
        t = threading.Thread(target=saySorry)
        t.start() #启动线程,即让线程开始执行

(3) 主线程会等待所有的子线程结束后才结束

#coding=utf-8
import threading
from time import sleep,ctime

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__':
    print('---开始---:%s'%ctime())

    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)

    t1.start()
    t2.start()
    print("---结束---:%s"%ctime())

(4) 查看线程数量

#coding=utf-8
import threading
from time import sleep,ctime

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__':
    print('---开始---:%s'%ctime())

    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)

    t1.start()
    t2.start()

    while True:
        length = len(threading.enumerate())
        print('当前运行的线程数为:%d'%length)
        if length<=1:
            break

        sleep(0.5)

你可能感兴趣的:(认识进程和线程)