LINJING BI

biubiubiu...


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

部署pycharm上的本地项目到服务器

发表于 2019-04-01 | 分类于 python

如何将用pycharm调试的本地项目部署到服务器(ubuntu)

  • pycharm创建项目时一同创建virtualenv(默认会自动创建)
  • 项目调试完毕后,生成requirements.txt依赖管理文件
    打开pycharm下方的工具栏里的terminal,在项目根目录下生成依赖文件

    1
    pip freeze >requirements.txt
  • 除了虚拟环境模块(默认叫venv),上传其他项目模块至服务器

  • 服务器上安装virtualenv(服务器上用python3)

    1
    2
    3
    4
    5
    6
    pip3 install virtualenv   // 安装虚拟环境
    virtualenv venv // 创建虚拟环境venv,最好在项目根目录下执行
    cd venv // 进入虚拟环境目录
    source ./bin/activate // 进入虚拟环境
    pip3 install -r <where_you_are>/<项目根目录>/requirements.txt // 在虚拟环境下安装项目依赖
    pip3 list // 查看安装的依赖
  • 部署完毕,项目所有的依赖在虚拟环境下安装完毕。

python输出重定向

发表于 2019-04-01 | 分类于 python

sys.stdout输出重定向

收集sys.stdout写入输出缓冲区的内容写入txt文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import os

BASE_DIR = os.path.dirname(__file__)
class _ResultCollector:
"""重定向sys.stdout,将输出缓冲区的内容写入指定路径下的指定文档,用于后期测试"""

def __init__(self, filename="Default.txt"):
try:
os.mkdir('./results')
except FileExistsError:
pass
# 转移sys.stdout,不妨碍sys.stdout的正常使用
self.terminal = sys.stdout
# 创建存放输出的文件
res_dir = os.path.join(BASE_DIR, 'results/{}'.format(filename))
self.result = open(res_dir, 'a')

def write(self, message):
"""
进行重定向文件的写,以及正常的sys.stdout的写
:param message: 输出缓冲区的内容 type str
:return:
"""
self.terminal.write(message)
self.result.write(message)

# def flush(self):
# self.terminal.flush()
#
# def getvalue(self):
# self.terminal.getvalue()

redis基本语法

发表于 2019-01-17 | 分类于 redis

基本语法

键值对

来自try-redis
设置key-value。SET key value

1
2
> SET server_name "bi" 
> GET server_name => "bi"

SETNX key value: (SET-if-not-exists)

1
> SETNX number 12  => if exists return (integer) 1 else (integer) 0

INCR key: 给key存储的value(必须是integer)加1,该操作满足原子性。如果key不存在初始化为0然后加1并返回1

1
INCR number => (integer) 13

EXPIRE + TTL: 设置+查看key的过期时间(s)。如果一个key已经过期,TTL会返回-2,反之,返回其剩下的秒数。如果一个key未设置EXPIRE,TTL返回-1,表示永不过期。

1
2
3
4
5
6
SET expire:clock 'demo'
EXPIRE expire:clock 120
TTL expire:clock => (120s内) 剩余时间 / => (超时) -2

SET server_name 'bi'
TTL server_name => -1

阅读全文 »

python实现LRU

发表于 2019-01-16 | 分类于 python

LRU简述

Least Recently Used,最近最少使用。LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是著名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。因此,我们只需要在每次调换时,
找到最近最久未使用的那个页面调出内存。这就是LRU算法的全部内容。
set时注意事项:由于存在内存中的页面个数是有限的,所以当我们把内存中不存在的页面用set把它从外存存到内存的时候,我们要首先查看,内存个数是否已满。此外,当我们要修改已存在页面的时候,我们还要把他重新放置到最右端,因为他很有可能马上会被再次访问。
get时注意事项:如果试图读取不存在的页面会报错。成功读取页面后,还要把读取的页面放置最右端。

阅读全文 »

go day 1

发表于 2018-12-30 | 分类于 go

一些感想。。。

学习go的第一天,感觉python把我惯坏了,真实的编程世界是很残酷的。但是还是要努力学下去啊!加油鸭!!
老老实实的记笔记,数据类型比python复杂多了,写法都记了半天,定义的时候记住数字优先然后类型。
提醒一下,所有的语句都要放在函数内部,函数要放在package main里,并且package里要有main函数,下面开始正文吧

阅读全文 »

python中__call__的用法

发表于 2018-12-29 | 分类于 python

看用python实现一个简单的web框架时,看到了call的用法,用来处理路由问题,貌似Flask里面也是用这个来实现路由Routing。
这玩意儿挺绕的,想清楚就赶快写下来,以后备用。其实跟函数装饰器很相似,也完全可以当成函数装饰器来用。
先讲一下call比较简单的一种用法,就是让类的实例变成可调用对象。

阅读全文 »

python线程池解析及自制线程池(基础款)

发表于 2018-12-28 | 分类于 python

为什么需要线程池

目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。
传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是“即时创建, 即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。
我们将传统方案中的线程执行过程分为三个过程:T1、T2、T3:
T1:线程创建时间
T2:线程执行时间,包括线程的同步等时间
T3:线程销毁时间
那么我们可以看出,线程本身的开销所占的比例为(T1+T3) / (T1+T2+T3)。如果线程执行的时间很短的话,这比开销可能占到20%-50%左右。如果任务执行时间很频繁的话,这笔开销将是不可忽略的。
除此之外,线程池能够减少创建的线程个数。通常线程池所允许的并发线程是有上界的,如果同时需要并发的线程数超过上界,那么一部分线程将会等待。而传统方案中,如果同时请求数目为2000,那么最坏情况下,系统可能需要产生2000个线程。尽管这不是一个很大的数目,但是也有部分机器可能达不到这种要求。
因此线程池的出现正是着眼于减少线程池本身带来的开销。线程池采用预创建的技术,在应用程序启动之后,将立即创建一定数量的线程(N1),放入空闲队列 中。这些线程都是处于阻塞(Suspended)状态,不消耗CPU,但占用较小的内存空间。当任务到来后,缓冲池选择一个空闲线程,把任务传入此线程中运行。当N1个线程都在处理任务后,缓冲池自动创建一定数量的新线程,用于处理更多的任务。在任务执行完毕后线程也不退出,而是继续保持在池中等待下一次的任务。当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源。
基于这种预创建技术,线程池将线程创建和销毁本身所带来的开销分摊到了各个具体的任务上,执行次数越多,每个任务所分担到的线程本身开销则越小,不过我们另外可能需要考虑进去线程之间同步所带来的开销。

阅读全文 »

leetcode-53 最大子数组

发表于 2018-12-19 | 分类于 leetcode

题目:

找到一个整数数组的最大累加和子数组
例子:
Input: [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: [4,-1,2,1]有最大累加和=6。

这道题用到了Kadane‘s 算法。算法指出,在数组A中,如果我们知道一个以位置i为截至元素的最大累加和子数组Bi,那么在i+1位置上的最大累积和子数组Bi+1
要么是一个前缀为Bi的子数组,要么不是。Bi+1 = max(Bi+A[i+1],A[i+1])。

阅读全文 »

leetcode-220 存在重复元素 III

发表于 2018-12-18 | 分类于 leetcode

题目:

检测一个包含整数的数组中是否存在nums[j],nums[i],
使得nums[i]-nums[j]的绝对值不超过t,并且i和j的距离不超过k。
例子:
Input:nums = [1,2,3,1], k=3, t=0
Output: true
阅读全文 »

Python多线程编程

发表于 2018-12-06 | 分类于 python多线程编程

python的threading模块

一、线程

线程是操作系统能够进行运算调度的最小单位。线程被包含在进程中,是进程中实际处理单位。
一条线程是指进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

二、进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

三、区别

进程是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。
进程中所包含的一个或多个执行单元成为线程。进程还拥有一个私有的虚拟地址空间,该进程空间仅能被它所包含的线程访问。
线程只能归属于一个进程并且它只能访问该进程所拥有的资源,一个进程下的所有线程共享该进程的资源。当操作系统创建一个进程后,该进程自动申请一个名为主线程或首要线程的线程。
处理计算密集型任务或函数用进程
处理IO密集型任务或函数用线程

四、GIL

首先,GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。
同一段代码可以在CPython,PyPy,Psyco等不同的Python执行环境中运行,其中PyPy就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境,所以CPython的GIL缺陷也就约等在了Python身上。
GIL特性:
python中的一个线程对应于c语言中的一个线程(CPython)
GIL使得同一时刻只有一个线程在CPU上执行字节代码,无法将多个线程映射到多个CPU上去执行。
GIL会很据执行的字节码行数以及时间片释放GIL,GIL在遇到io操作时会主动释放

也就是说 在同一时刻,只有一个线程进入CPython解释器
解决GIL限制的办法:

1. 多进程编程:既然多线程不能同时进入CPython解释器,我们可以通过把多个线程放入不同进程中,让多进程进入CPython解释器,分配给各个CPU,以利用多核实现并行。  
2. 协程:后面会讲到
12

Bi

19 日志
7 分类
24 标签
RSS
GitHub E-Mail
Links
  • PIPIJI's COOP
© 2018 — 2019 Bi
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4