11 2018 档案
摘要:from gevent import monkey;monkey.patch_all()from gevent.queue import Queue #队列 gevent中的队列import geventimport random#这个猴子补丁,all是所有能切换协程的地方都切换,包含了socket,所以一般都用allqq = Queue(3)def produceer(): wh...
阅读全文
摘要:并发:要做到同时服务多个客户端,有三种技术 1. 进程并行,只能开到当前cpu个数的进程,但能用来处理计算型任务 ,开销最大 2. 如果并行不必要,那么可以考虑用线程并发,单位开销比进程小很多 线程:并发(轮询调度,遇到阻塞就切换) 只要是网络,就会有延迟,有延迟就阻塞,所以比一般的单路要好些 3.
阅读全文
摘要:1. 导gevent中的猴子补丁,来把原来python自带的socket变成基于epoll的socket(解除阻塞问题) 代码:
阅读全文
摘要:代码: from greenlet import greenlet import random def pro(): 生产者 while True: item = random.randint(0,99) print("生产了:",item) c.switch(item) 向消费者发送item ,并
阅读全文
摘要:思路: yield可以使得函数阻塞,next,和send可以解阻塞,实现数据不竞争的生产者消费者模式 代码: import random #随机数,模拟生产者的制造物 def eat(): #消费者 while True: item = (yield) print("消费了:",item) def
阅读全文
摘要:思想: 1. 创建与服务器相同cpu个数的进程个数来监听(accept)客户端响应,并在每个进程中先创建好一个线程池 2. 有客户端访问时,解除其中一个进程的accpet阻塞,进入到线程中来执行接收数据工作( recv() ),用线程防止recv阻塞,线程调用recv方法 3. main主函数调用时
阅读全文
摘要:1. 注意: 导包是: from multiprocessing.pool import ThreadPool #线程池不在thrading中 2. 代码: from mutiprocessing.pool import ThreadPool def func(*args,**kwargs): pr
阅读全文
摘要:注意:必须加 close() 和 join(),且 close 必须在 join 之前 代码: import multiprocessing #执行方法 def func(*args,**kwargs): print(args,kwargs) pool = multiprocessing.Pool(
阅读全文
摘要:代码: import threading 图例:
阅读全文
摘要:思路: 利用thread类中,run方法在子线程中调用,其他方法在主线程调用,所以将生产者写入主线程,将消费者写入run函数中在子线程中执行,完成生产者消费者模型 注意: 1. 要在 init 函数中实例化一个Queue队列作为生产者消费者中介 2. 要在 init 函数中把daemon值设为Tru
阅读全文
摘要:1. q = queue.Queue(5) 实例化,5为队列长度 2. q.put("haha") 将数据加入队列,计数器+1 3. q.get() 取出数据,计数器不变 4. q.join() 阻塞,知道计数器为0 5. q.task_done() 计数器-1 代码:
阅读全文
摘要:注意 : mgr = multiprocessing.Manager() 生成了一个守护进程,如果主进程完毕,mgr这个实例也没有了,所以在结尾加了mgr.join()才能运行 代码:
阅读全文
摘要:import threading import queue import random import time qq = queue.Queue(4) #实例化一个队列,因为是一个进程的线程,所以共资源 #重写线程类 class produce(threading.Thread): def __init__(self,myqueue): super().__in...
阅读全文
摘要:gil锁作用: 遇到阻塞( 比如 recv() , accept() )就切换
阅读全文
摘要:用法: 先实例化 lock = threading.Lock() 1. lock.acquire() 上锁 需上锁代码 lock.release() 解锁 2. with lock: 上下两种方式都行 需上锁代码 整体代码: import threading lock = threading.Loc
阅读全文
摘要:import multiprocessing mgr = mutiprocessing.Manager() 开启一个守护子进程,并返回用来与其通信的管理器 share_list = mgr.list() #还有mgr.dic() , mgr.Queue() 方法 def func(myli): my
阅读全文
摘要:import multiprocessing class mypro(multiprocessing.Process): def __init__(self,a,b): super().__init()__ 原生的Process里面的许多函数需要原生构造函数初始化 self.a = a self.b
阅读全文
摘要:import socket import threading server = socket.socket() server.bind(("127.0.0.1",8899)) server.listen(1000) def func(conn): while True: data_recv = co
阅读全文
摘要:1. multiprocessing 多进程: import multiprocessing p = multiprocessing.Process(target = func,name = "自定义进程名",args = (),kwargs={}) 生成一个子进程,args=(1,)里面传元组 p
阅读全文
摘要:1. 代码: import socket import selectors #IO多路复用的选择模块 epoll_selector = selectors.EpollSelector() 实例化一个和epoll通信的选择器 server = socket.socket() server.bind((
阅读全文
摘要:server端: 1. 阻塞型套接字,不能满足多个客户端同时访问 import socket server = socket.socket() server.bind((""127.0.0.1,8898)) while True: server.listen(2) 2为最大同时连接数,python3
阅读全文
摘要:1. 导包: import pymongo 2. 建立连接 client = pymongo.MongoClient("127.0.0.1",27017) 3. 获取数据库 db = client["test1"] 4. 获取集合 col = db["t2"] 5. 插入数据: col.insert
阅读全文
摘要:1. mongo 进入 2. exiit 退出 库操作: 1. show dbs 查看所有库 2. db.dropDatabase() 删除当前所在的库 3. use 库名 用哪个库 集合操作: 1. db.createCollection("haha") 创建一个集合 2. show collec
阅读全文
摘要:1. 四步: import logging #初始化 logger = logging.getLogger("log_name") #设置级别 logger.setLevel(logging.DEBUG) #设置最低级别,小于它的都不会打印 #定义handler #定义控制台输出的handler s
阅读全文
摘要:1. date(),time(),datetime() 时间数据概用: 2. datetime.datetime.now() 获取当前时间 datetime.datetime.utcnow() 获取格林威治当前时间 3. datetime.datetime.strptime("Aug-6-18 21
阅读全文
摘要:不需要知道原来的信息,只需要存储加密后的信息,登录时比对加密后信息就ok了 1. imort hashlib password = "11234" 2. salt2 = "aada".encode() #加盐编码字符串 3. result = hashlib.md5(password + salt2
阅读全文
摘要:1. os.getcwd() 显示当前路径 2. a = os.name 显示当前操作系统 3. a = listdir(path) 显示该路径的所有内容,类似与ls 4. os.chdir("/") 改变当前路径 5. os.mkdir("makedir") 创建文件夹 6. os.rmdir("
阅读全文
摘要:1. python 转 json import json data={ "name":"haha", "age" : 1,"list_1":[1,2,3], "tu":(1,2,3), "bo": True, "kong":None } result = json.dumps(data) print
阅读全文
摘要:1. 连接 import redis re = redis.Redis( host = "127.0.0.1", port = 6379 ) 2. 字符串数据: re.set("name",2) #设置name的值为2 data = re.get("name") print(data.decode(
阅读全文
摘要:import pymysql conn = pymysql.connect( host = "127.0.0.1", port = 3306, user = "test1", password = “123456”, db = "myfirst", charset = "utf8" ) cur =
阅读全文
摘要:1. import 2. from ... import ... 3. from ... import .... as... 4. 在包管理中 加一个 __init__.py 文件 不然可能会报错
阅读全文
摘要:1. linux 进入redis数据库: redis-cli 2. 退出 exit 3. 键值对: 1. 添加数据:set name jiji (set + 键 +值) 2. 查看数据:get name (get + 键 ) 3. 查看过期时间: ttl name (-1代表永久 , -2代表不存在
阅读全文
摘要:1. mysql -uroot -pqwe123 (进入mysql) -u = user -p = password 2. \q退出 3. select user(); 查看当前用户 创建用户的三步: 1. create user "用户名"@"%" identified by "密码" ; (创建
阅读全文
摘要:import io f = io.StringIO() f.write("") f.getvalue() f.close 二进制 f = io.Bytesio()
阅读全文