36. 述多进程开发中join与deamon的区别
# 答案:
'''
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
'''
37.请简述GIL对Python性能的影响
# 答案:
'''
GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行字节码。
线程释放GIL锁的情况:
在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL
Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100
Python使用多进程是可以利用多核的CPU资源的。
多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁
'''
38.曾经在哪里使用过: 线程、进程、协程?
# 答案:
'''
1.在写高并发的服务端代码时。
2.在写高性能爬虫的时候。
'''
39.请使用yield实现一个协程?
# 答案:
import time
import queue
def consumer(name):
print("--->starting eating baozi...")
while True:
new_baozi = yield
print("[%s] is eating baozi %s" % (name,new_baozi))
#time.sleep(1)
def producer():
r = con.__next__()
r = con2.__next__()
n = 0
while n < 5:
n +=1
con.send(n)
con2.send(n)
print("\033[32;1m[producer]\033[0m is making baozi %s" %n )
if __name__ == '__main__':
con = consumer("c1")
con2 = consumer("c2")
p = producer()
40.请使用python内置async语法实现一个协程?
# 答案:
from datetime import datetime
import asyncio
async def add(n):
print(datetime.now().strftime('%H:%M:%S.%f'))
count = 0
for i in range(n):
count += i
print(datetime.now().strftime('%H:%M:%S.%f'))
return count
async def fun(n):
res = await add(n)
print(f'res = {res}')
loop = asyncio.get_event_loop()
tasks = [fun(20000000), fun(30000000)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()