其他
socket.gethostname() # 获取当前主机的主机名
uuid.getnote() # 获取本机的MAC地址
mac=uuid.UUID(int = node).hex[-12:][ ]
readme_renderer
进程
通过fork可以创建一个子线程。子线程可以完整地运行并且每个子线程可以充分地利用一个cpu.当一个线程崩溃后,不会影响其他线程
线程
python的解释器在执行代码的时候,有个GIL锁,保证同一时间只有一个线程执行。所以不能充分利用CPU。但是这不代表不会出现几个线程打乱数据的问题,因为线程的切换是按照python字节码来处理的。test/test_thread.py 不会应为有多核CPU而变快。但是test/test_fork.py会因为多核而变快
用kill杀出一个子线程后,会导致进程崩溃
性能
time.time 来判断是否刷新缓存,1秒能执行753万次
if time.time() > start :
refresh()
random.random 来判断, 1秒能执行977万次
if random.random() > 0.0000001:
refresh()
多进程的queue: 50K/s
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Xiang Wang <ramwin@qq.com>
import time
from multiprocessing import Process, Queue
from multiprocessing.queues import Empty
N = 100_000
def product(q):
for i in range(N):
q.put([i, None, "Hello"])
def consumer(qs):
n = 0
while True:
try:
a = qs.get(timeout=0.1)
n += 1
except Empty:
print("没有数据了", n)
return
def main():
start = time.time()
q = Queue()
p1 = Process(target=product, args=[q])
p1.start()
p2 = Process(target=consumer, args=[q])
p2.start()
p1.join()
p2.join()
end = time.time()
print("多进程的queue速度:", N // (end - start))
if __name__ == "__main__":
main()
redis.get
本地测试key长度为3和长度为720都差不多0.05ms, 20K/s数据库的get
0.3ms, 2K/s