网络编程 IP,端口,协议(TCP)
创建进程: import multiprocessing 密集计算用进程
aa=multiprocessing.Process(target=函数名) 创建进程对象
传实参给函数的两种方式,元组,和字典
aa=multiprocessing.Process(target=coding,args=('ddddd',))
aa=multiprocessing.Process(target=music_,kwargs={'shijian':5})
aa.daemon=True 设置守护主进程,必须在start前设置,监听主进程,主进程结束,子进程也立马结束
aa.terminate() 子进程自己结束自己
aa.start() 开始运行进程并调用函数
aa.join() 等待执行,主进程等待aa进程执行完之后,再继续往下执行
操作进程: import os
bb=os.getpid() 获取当前进程id
cc=multiprocessing.current_process().pid 获取当前进程id
dd=os.getppid() 获取父进程id
os.kill(pid,9) 杀死当前进程,9是确认杀死
注意点:进程之间的全局变量是不共享的,当创建并运行子进程后,子进程会复制一份主进程的所有代码,那这时在子进程修改全局变量主进程并不会被修改。这时候只是进程之间的全局变量名一样,但操作的不是同一进程里面的全局变量
###### 线程是进程中的任务 进程有id 线程没有id,但是可以返回线程对象
IO密集用线程
创建线程 : import threading
aa=threading.Thread(target=函数名) 创建线程对象
aa.start() 启动线程
创建线程并传参给函数,与进程一样 args=元组,kwargs=字典
print(threading.current_thread()) 获取线程对象
aa.daemon=True 主线程守护,主线程结束,子线程也结束
aa.join() 主线程等待当前线程执行完成
注意点:执行时无序的,线程之间共享全局变量,但有可能会有错误。
aa=threading.Lock() 创建互斥锁,能解决线程全局变量共享出错的问题
aa.acquire() 上锁
aa.release() 解锁
互斥锁把全局变量放在锁之间,没解锁,就是死锁,代码会卡死
只要是网络程序都会用到socket来完成,所有网络通讯
TCP
ww=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 创建socket连接对象
可执行多任务服务器代码
import socket
import threading
def chuli(newser_socket,ipadd):
while True:
straa = newser_socket.recv(1024)
if len(straa) == 0:
print('客户端下线了',ipadd)
break
print(straa.decode('utf-8'))
newser_socket.send('服务端收到信息,谢谢'.encode('utf-8'))
newser_socket.close()
if __name__=='__main__':
ser_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ser_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) #复用服务端
ser_socket.bind(('',8080))
ser_socket.listen(128)
while True:
new_sco1,ipadd=ser_socket.accept()
print('来自客户端连接:',ipadd)
xiancheng1=threading.Thread(target=chuli,args=(new_sco1,ipadd))
xiancheng1.daemon = True
xiancheng1.start()
# ser_socket.close()
客户端代码
import socket
import time
client_sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_sock.connect(('127.0.0.1',8080))
for i in range(10):
client_sock.send('00000000000'.encode('utf-8'))
fanhui=client_sock.recv(1024)
print(fanhui.decode('utf-8'))
time.sleep(1)
client_sock.close()