今日概要
1、线程
2、协程
3、socketserver
4、基于udp的socket(见第八节)
一、线程
1、threading模块
第一种方法:实例化
import threading
import time
#第一种方法实例化
def sayhi(num):
print('running on num %s' %(num))
time.sleep(3)
if __name__ == '__main__':
t1 = threading.Thread(target=sayhi,args=(1,)) #实例化线程
t2 = threading.Thread(target=sayhi, args=(1,))
t1.start() #执行start方法
t2.start()
print(threading.active_count()) #统计线程数量
print(t1.getName())
print(t2.getName())
第二种方法类的继承
import threading
import time
#第二种方法类的继承
class MyThread(threading.Thread):
def __init__(self,num):
super().__init__()
self.num = num
def run(self):
print('running on num %s' % (self.num))
print('start time : %s'%(time.time()))
time.sleep(3)
print('end time : %s'%(time.time()))
if __name__ == '__main__':
t1 = MyThread(1)
t2 = MyThread(2)
t1.start()
t2.start()
2、在一个进程下开启多个线程与在一个进程下开启多个子进程的区别
谁的开启速度快? 开启线程的速度快
from threading import Thread
from multiprocessing import Process
def talk(name):
print ('%s is talking' %name)
if __name__ == '__main__':
t = Thread(target=talk,args=('dragon',))
t.start()
print ('主线程')
'''
输出:
dragon is talking
主线程
'''
p = Process(target=talk,args=('dragon',))
p.start()
print('主线程')
'''
输出:
主线程
dragon is talking
'''
看一看pid? 线程的pid和当前进程一样,进程的pid各自独立
from threading import Thread
from multiprocessing import Process
import os
def talk():
print ('%s is talking' %os.getpid())
if __name__ == '__main__':
t = Thread(target=talk)
t1 = Thread(target=talk)
t.start()
t1.start()
print('主线程pid: %s' %os.getpid())
'''
21592 is talking
21592 is talking
主线程pid: 21592
'''
p = Process(target=talk)
p1 = Process(target=talk)
p.start()
p1.start()
print('主线程pid: %s' % os.getpid())
'''
主线程pid: 21724
21460 is talking
20496 is talking
'''
from socket import * from threading import Thread def server(ip,port): s = socket(AF_INET,SOCK_STREAM) s.bind((ip,port)) s.listen(5) while True: #链接循环变成多线程 conn,addr = s.accept() t = Thread(target=talk,args=(conn,addr)) t.start() def talk(conn,addr): '''通信循环''' try: while True: res = conn.recv(1024) if not res :break print('client %s:%s msg:%s' % (addr[0], addr[1], res)) conn.send(res.upper()) except Exception: pass finally: conn.close() if __name__ == '__main__': server('127.0.0.1',9999)