网络并发编程面试题31-40

业务服务器192.168.1.2访问192.168.1.3数据接口, 无法正常返回数据, 请根据以上信息写出排查思路。

pass

请实现一个简单的socket编程。

'''
要求:
1.实现server端的功能即可
2.遵循基本语言编程规范
'''
# 答案:
# 服务端:
# coding=utf-8

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 8888))
server.listen(5)

#等待客户端连接
while True:
    (client, address) = server.accept()
    data = client.recv(4096)
    print data
    client.send("hello")                                                    
    client.close()


# 客户端
import socket                
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8888))
client.send("My name is client")
message = client.recv(4096)                                                      
print message                
client.close()

谈一下对于多线程编程的理解, 对于CPU密集型怎样使用多线程, 说说线程池, 线程锁的用法, 有没有用过multiprocessing或concurrent.future?

# 答案:
'''
CPU密集型使用多进程
IO密集型使用多线程
加锁
锁定
释放
'''

关于守护线程的说法, 正确的是

'''
A.所有非守护线程终止, 即使存在守护线程, 进程运行终止
B.所有守护线程终止, 即使存在非守护线程, 进程运行终止
C.只要有守护线程或者非守护线程其中之一存在, 进程就不会终止
D.只要所有的守护线程和非守护线程中终止运行之后, 进程才会终止
'''
# 答案:
A

TCP协议在每次建立或者拆除连接时, 都要在收发双方之间交换()报文

'''
A.一个
B.两个
C.三个
D.四个
'''
# 答案:
C

口述多进程开发中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()之前设置
'''

请简述GIL对Python性能的影响

# 答案:
'''
GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行字节码。
线程释放GIL锁的情况:
在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL
Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100
Python使用多进程是可以利用多核的CPU资源的。
多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁
'''

曾经在哪里使用过: 线程、进程、协程?

# 答案:
'''
1.在写高并发的服务端代码时。
2.在写高性能爬虫的时候。
'''

请使用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()

请使用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()
posted @ 2019-12-13 19:11  極9527  阅读(196)  评论(0编辑  收藏  举报