我知道实际上没有单一的正确方法.但是我发现很难创建一个运行良好的目录结构,并为每个开发人员和管理员保持干净.github上的大多数项目都有一些标准结构.但它没有显示在pc上组织其他文件和所有项目的方法.
在开发机器上组织所有这些目录最方便的方法是什么?您如何命名它们,以及如何将其连接并部署到服务器?
我想解决的问题:
我在具有3个CPU内核的VDS上安装了Nginx + uWSGI + Django.uWSGI配置为每个进程6个进程和5个线程.现在我想告诉uWSGI使用进程进行负载平衡,直到所有进程都忙,然后根据需要使用线程.似乎uWSGI更喜欢线程,我没有找到任何配置选项来改变这种行为.第一个进程占用100%的CPU时间,第二个进程占用大约20%,另一个进程大部分未使用.
我们的网站收到40 r/s.实际上即使没有线程的3个进程也足以处理所有请求.但是由于锁定共享资源等各种原因,请求处理会不时挂起.在这种情况下,我们有-1进程.用户不喜欢等待并反复单击该链接.因此,所有进程都会挂起,所有用户都必须等待.
我会添加更多的线程来使服务器更健壮.但问题可能是python GIL.线程不会使用所有CPU核心.因此,多个进程可以更好地实现负载平衡.但是在锁定共享资源和i/o等待延迟的情况下,线程可能会有很大帮助.当其中一个线程被锁定时,一个进程可能会做很多工作.
在没有其他解决方案之前,我不想减少时间限制.理论上可以用线程来解决这个问题,我不希望向用户显示错误消息或让他等待每个请求,直到没有其他选择.
我在DotCloud上使用Django,它在uwsgi + nginx之上使用Django.我试图将所有http流量重定向到https,这导致重定向循环.我使用以下http配置
if ($http_x_forwarded_port != 443) { rewrite ^ https://$http_host/; }
Run Code Online (Sandbox Code Playgroud)
似乎Django不理解它在https上运行并且标头没有被保留.它将https://url.com/重定向 到http://url.com/accounts/login/,它会一次又一次地重定向,从而导致重定向循环.我不是nginx的专家,也不太了解它.我能做错什么?
简而言之,如何在运行在uswsgi和nginx之上的django中将http重定向到https.
我正在寻找一种方法来从命令行覆盖/定义一些单独的django设置,而无需额外的设置文件.
我现在需要的是每次运行管理命令时设置DEBUG设置或日志记录级别.但能够设置任何东西都会很棒.
我需要一个有效的结构,用于数千个相同类型的元素的数组,能够进行随机访问.
虽然列表在迭代和前置时效率最高,但随机访问速度太慢,因此不符合我的需求.
地图效果更好.Howerver它会导致一些开销,因为它用于键值可能是任何东西的键值对,而我需要一个索引从0到N的数组.因此我的应用程序对于地图工作太慢.我认为这对于处理具有随机访问的有序列表这样的简单任务来说是不可接受的开销.
我发现元组是Elixir中最有效的结构,用于我的任务.与我的机器上的地图相比,它更快
因此,我的元组代码比地图上的相同代码快5倍.它可能不需要解释为什么元组比map更有效.目标已经实现,但是每个人都告诉"不要使用元组来获取类似元素的列表",没有人可以解释这个规则(这种情况的例子 /sf/answers/2183522631/).
顺便说一句,Python中有元组.它们也是不可变的,但仍然是可迭代的.
所以,
1.为什么 Elixir中的元组不可枚举?有任何技术或逻辑限制吗?
2.而为什么我不应该把它们作为相似的元素列表?有什么缺点吗?
请注意:问题是"为什么",而不是"如何".上面的解释只是一个例子,其中元组比列表和映射更好.
我发现计算Enum.map |> Enum.sum的速度要快得多Enum.count.但为什么内置计数功能不高效呢?
比较这两行:
elements |> Enum.count(&check/1)
elements |> Enum.map(&(if check(&1), do: 1, else: 0)) |> Enum.sum
Run Code Online (Sandbox Code Playgroud)
不同长度列表的测试结果:
len | map(), µs | count(), µs
===============================
10 | 0.67 | 2.55
100 | 5.52 | 8.91
1000 | 59.00 | 73.12
10000 | 642.50 | 734.60
Run Code Online (Sandbox Code Playgroud)
源代码:https://gist.github.com/artemrizhov/fc146f7ab390f7a807be833099e5cb83
$ elixir --version
Erlang/OTP 19 [erts-8.1] [source-e7be63d] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Elixir 1.3.4
Run Code Online (Sandbox Code Playgroud) 我的 Python 项目依赖于 C++ 程序。我想创建一个 python 包来编译这个程序并将其安装到虚拟环境中。该程序应出现在当前 PATH 中。
我尝试使用该ext_modules选项注册源文件,但它创建了 .so 模块。不完全是我需要的。
有没有办法实现这一目标?
我安装了sessionman,它运行正常.但是当我重新加载X会话两次(注销/登录,重启等)时会丢失会话,因为当KDE恢复Gvim时,它不会自动加载会话,而只会加载最后一个文件,然后在下次重新加载时将其保存在最后一个会话名称下.如果我没有运行SessionOpen,那么在下次重新加载时,我的上一个会话将丢失.
我已经配置了会话自动保存.如果Gvim也可以自动加载上一个会话,那将是很好的.但是,即使手动,此功能也不适用于我.当我重新启动Gvim时,SessionShowLast打印"上一个会话未定义,当前会话是""".
sessionman文档说:"打开的会话的名称保存在g:LAST_SESSION变量中,如果'viminfo'选项包含'!',则保存在viminfo文件中.但是我没有找到任何明确的解释什么是"viminfo选项",它应该包含'!',以及如何设置它.另外我不确定如何从vimrc执行SessionOpenLast.
如果我试图解决问题的方式是错误的,那么请纠正我.
我想部分应用一个功能.有没有标准简洁的方法在Elixir做任何一种currying?
我知道我可以做这样的事情:
new_func = fn(arg2, arg3) -> my_func(constant, arg2, arg3) end
new_func2 = fn -> my_func2(constant) end
Run Code Online (Sandbox Code Playgroud)
但它看起来很难看.
django ×3
elixir ×3
python ×3
performance ×2
uwsgi ×2
arrays ×1
c++ ×1
count ×1
currying ×1
distutils ×1
dotcloud ×1
enumerable ×1
logging ×1
organization ×1
process ×1
session ×1
setuptools ×1
tuples ×1
vim ×1
virtualenv ×1