python-进程和线程模块的认识

1.面试题目:
进程是系统进行资源分配和调度的一个独立单位
线程是CPU调度和分派的基本单位
一个程序至少有一个进程,一个进程至少有一个线程
计算密集型的任务一般选择多进程,IO密集型的任务一般选择多线程
2、创建进程的两种方式
第一:直接通过进程类Process进行创建,直接指定target(函数法)
第二:继承Process类,并重写run方法 (继承Process类法)

1from multiprocessing import Process
import random
from time import sleep
import os

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

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

#创建进程对象
p1=Process(target=sing,name='p-sing',daemon=True)
print(p1.name)
print(p1.pid)
print(p1.daemon)

p2=Process(target=dance)
p2.name='p-dance'
p2.daemon=True
print(p2.name)
print(p2.pid)
print(p2.daemon)



#开始运行
p1.start()
p2.start()

sleep(random.random())
print('game over...')

(2from multiprocessing import Process
import random
from time import sleep
import os

class MyProcessSing(Process):
    def run(self):
        for i in range(3):
            print('Sing...%d..%d'%(i,os.getpid()))
            sleep(random.random())

class MyProcessDancer(Process):
    def run(self):
        for i in range(3):
            print('Dance...%d..%d'%(i,os.getpid()))
            sleep(random.random())


sing=MyProcessSing(name='p-sing',daemon=True)#守护进程(daemon)
print(sing.name)
print(sing.daemon)
sing.start()

dancer=MyProcessDancer()
dancer.name='p-Dancer'
print(dancer.name)
print(dancer.daemon)
dancer.start()

sleep(random.random())
print('game over...')

3、创建线程的两种方式
第一:直接通过线程类Thread进行创建,直接指定target。(函数法)
第二:继承Thread类,并重写run方法。(继承Thread法)

(1)
from threading import Thread
import random
from time import sleep

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

def dancer():
    for i in range(3):
        print('正在跳舞...%d'%i)
        sleep(random.random())

#创建线程对象
t1=Thread(target=sing)
t2=Thread(target=dancer)

#开始运行
t1.start()
t2.start()

sleep(random.random())
print('game over...')

(2)

from threading import Thread
from time import sleep
import random
import os

class MyThreadSing(Thread):
    def run(self):
        for i in range(3):
            print('Sing...%d...%d'%(i,os.getpid()))
            sleep(random.random())

class MyThreadDancer(Thread):
    def run(self):
        for i in range(3):
            print('Dancer...%d...%d'%(i,os.getpid()))
            sleep(random.random())

if __name__=='__main__':
    sing=MyThreadSing(name='T-Sing')
    print(sing.name)
    print(sing.daemon)
    sing.start()

    dancer = MyThreadDancer(name='T-Dancer',daemon=True)
    print(dancer.name)
    print(dancer.daemon)
    dancer.start()


    #sleep(0.1)
print('game over...')

4.互斥锁
threading模块中定义了Lock类,可以方便的处理锁定:

#创建锁
mutex = threading.Lock()
#锁定
mutex.acquire([blocking])
#释放
mutex.release()

其中,锁定方法acquire可以有一个blocking参数。
如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True)
如果设定blocking为False,则当前线程不会堵塞

5.面试知识–GIL
(1)什么是GIL?
在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。 不过muiltprocessing的出现,已经可以让多进程的python代码编写简化到了类似多线程的程度了。
(2)解决的GIL?
1、能用进程不用线程。
2、高效的代码使用c,c++来编写

猜你喜欢

转载自blog.csdn.net/qq_34663267/article/details/81709341
今日推荐