---恢复内容开始---
import socket from threading import Thread s = socket.socket() s.bind((‘127.0.0.1‘, 56984)) s.listen(5) def server_while(conn): while True: try: data = conn.recv(1024) print(data.decode(‘utf-8‘)) conn.send(data.upper()) except ConnectionResetError as c: print(c) break conn.close() if __name__ == ‘__main__‘: while True: conn, addr = s.accept() t = Thread(target=server_while, args=(conn,)) t.start()
import socket client = socket.socket() client.connect((‘127.0.0.1‘,56984)) while True: client.send(b‘sdjflaasdfad‘) data = client.recv(1024) print(data)
GIL的存在是因为CPython解释器的内存管理不是线程安全的
什么是内存管理(代码申请代码释放 相当于 with open close)
垃圾回收机制
1.引用计数:内存中的数据如果没有任何的变量名与其有绑定关系,那么会被自动回收
2.标记清除:当内存快要被某个应用程序占满的时候,会自动触发
3.分代回收:根据值得存活时间的不同,划为不同的等级,等级越高垃圾回收机制扫描的频率越低
from threading import Thread import time n = 100 def task(): global n tmp = n time.sleep(1) #相当释放了锁 release n = tmp -1 t_list = [] for i in range(100): t = Thread(target=task) t.start() t_list.append(t) for t in t_list: t.join() print(n)
from threading import RLock,Thread mutex = RLock() class MyThread(Thread): def __init__(self, name): super().__init__() self.name = name def run(self): mutex.acquire() print(‘{}抢到了锁‘.format(self.name)) mutex.acquire() print(‘{}抢到了锁‘.format(self.name)) mutex.acquire() print(‘{}抢到了锁‘.format(self.name)) mutex.acquire() print(‘{}抢到了锁‘.format(self.name)) mutex.release() print(‘{}释放了锁‘.format(self.name)) mutex.release() print(‘{}释放了锁‘.format(self.name)) mutex.release() print(‘{}释放了锁‘.format(self.name)) mutex.release() print(‘{}释放了锁‘.format(self.name)) if __name__ == ‘__main__‘: for i in range(10): t = MyThread(i) t.start()
from threading import Semaphore,Thread import time import random sm = Semaphore(5) # 造了一个含有五个的坑位的公共厕所 使用方法和 LOCK一样 生成对象 def task(name): sm.acquire() print(‘%s占了一个坑位‘%name) time.sleep(random.randint(1,3)) sm.release() for i in range(40): t = Thread(target=task,args=(i,)) t.start()
抢到锁的人执行完后走了 马上就会有人来了
原文:https://www.cnblogs.com/lddragon/p/11354368.html