【业百科源码】【源码商场】【助力源码】无名源码_无名代码复制

时间:2024-11-20 21:37:34 分类:QQ昵称api源码 来源:开放代源码许可

1.django如何启动服务器(部署django到服务器)
2.Go并发编程:goroutine,channel和sync详解
3.怎么通过EXE猜测C语言的无名无名源代码?

无名源码_无名代码复制

django如何启动服务器(部署django到服务器)

       本篇文章给大家谈谈django如何启动服务器,以及部署django到服务器对应的源码知识点,希望对各位有所帮助,代码不要忘了收藏本站喔。复制

       本文目录一览:

1、无名无名django 怎么重启服务器2、源码业百科源码Django部署——uwsgi+Nginx(超详细)3、代码Django源码阅读 (一) 项目的复制生成与启动django 怎么重启服务器

       如果你是用runserver来运行程序的话,

       你可以直接Ctrl+c,无名无名关掉后再运行python manager.py runserver重启。源码

       或者你可以打开settings.py中的代码debug参数,这样如果你修改了python代码,复制它会自动重启服务。无名无名

       如果解决了您的源码问题请采纳!

       如果未解决请继续追问!代码

       Django部署——uwsgi+Nginx(超详细)

       环境:

        python3.6

        centos 7

        Django1.

        用Django写了个小网站,源码商场只能在自己本地跑一跑!这怎么行?听说可以部署在云服务器上,这样别人就可以访问了!

        从哪儿开始?就从Django开始吧!老规矩,按步骤:

        这里不讲Django项目实施过程,假设你已经写了一个Django项目,并且在本地 .0.0.1: 能够跑起来。喏,给你个参考,项目大概长这样:

       也就是项目目录下的settings.py文件,主要强调几个地方:

        ①关闭DEBUG模式:

       ②修改ALLOWED_HOSTS:

       ③配置静态文件存放路径:

       修改好配置之后执行:

       这个没什么说的。。。在自己的云服务器上装好这两个工具

        安装好uwsgi后最好验证一下,验证方法:

        创建一个test.py文件:

        启动uwsgi服务器:

        如果可以正常启动而不报错那就应该没问题,助力源码不放心的话再在终端验证一下:

       在uwsgi.ini里进行如下配置:

        找到nginx的配置文件夹,centos7的nginx配置文件在/etc/nginx下,该路径下有一个nginx.conf总配置文件,还有两个文件夹./conf.d、./default.d,我们将nginx.conf复制一份到conf.d文件夹下,命名为nginx.conf(或者项目名.conf)进行如下修改(根据中文注释进行相应配置即可):

        进入uwsgi.ini文件夹下执行:

        在终端执行:

       

参考资料:

       刘江的博客

       博客园

       知乎问答

       无名Blog

       自强学堂Django教程

       Django文档

       empty_xl Blog

Django源码阅读 (一) 项目的生成与启动

        诚实的说,直到目前为止,我并不欣赏django。在我的认知它并不是多么精巧的设计。只是由功能堆积起来的"成熟方案"。但每一样东西的崛起都是时代的选择。无论你多么不喜欢,但它被需要。希望有一天,成人用品源码python能有更多更丰富的成熟方案,且不再被诟病性能和可维护性。(屁话结束)

        取其精华去其糟粕,django的优点是方便,我们这次源码阅读的目的是探究其方便的本质。计划上本次源码阅读不会精细到每一处,而是大体以功能为单位进行解读。

       django-admin startproject HelloWorld 即可生成django项目,命令行是exe格式的。

       manage.py 把参数交给命令行解析。

       execute_from_command_line() 通过命令行参数,创建一个管理类。然后运行他的 execute() 。

        如果设置了reload,将会在启动前先 check_errors 。stl源码解析

       check_errors() 是个闭包,所以上文结尾是 (django.setup)() 。

        直接看最后一句 settings.INSTALLED_APPS 。从settings中抓取app

        注意,这个settings还不是我们项目中的settings.py。而是一个对象,位于 django\conf\__init__.py

        这是个Settings类的懒加载封装类,直到 __getattr__ 取值时才开始初始化。然后从Settings类的实例中取值。且会讲该值赋值到自己的 __dict__ 上(下次会直接在自己身上找到,因为 __getattr__ 优先级较低)

       为了方便debug,我们直接写个run.py。不用命令行的方式。

        项目下建个run.py,模拟runserver命令

       debug抓一下setting_module

        回到 setup() 中的最后一句 apps.populate(settings.INSTALLED_APPS)

        开始看 apps.populate()

        首先看这段

        这些App最后都会封装成为AppConfig。且会装载到 self.app_configs 字典中

        随后,分别调用每个appConfig的 import_models() 和 ready() 方法。

       App的装载部分大体如此

        为了方便debug我们改写下最后一句

        res的类型是Command django.contrib.staticfiles.management.commands.runserver.Command object at 0xEDA0

        重点是第二句,让我们跳到 run_from_argv() 方法,这里对参数进行了若干处理。

        用pycharm点这里的handle会进入基类的方法,无法得到正确的走向。实际上子类Commond重写了这个方法。

        这里分为两种情况,如果是reload重载时,会直接执行 inner_run() ,而项目启动需要先执行其他逻辑。

       django 项目启动时,实际上会启动两次,如果我们在项目入口(manage.py)中设置个print,会发现它会打印两次。

        第一次启动时, DJANGO_AUTORELOAD_ENV 为None,无法进入启动逻辑。会进入 restart_with_reloader() 。

        在这里会将 DJANGO_AUTORELOAD_ENV 置为True,随后重启。

        第二次时,可以进入启动逻辑了。

       这里创建了一个django主线程,将 inner_run() 传入。

        随后本线程通过 reloader.run(django_main_thread) ,创建一个轮询守护进程。

        我们接下来看django的主线程 inner_run() 。

       当我们看到wsgi时,django负责的启动逻辑,就此结束了。接下来的工作交由wsgi服务器了

        这相当于我们之前在fastapi中说到的,将fastapi的app交由asgi服务器。(asgi也是django提出来的,两者本质同源)

        那么这个wsgi是从哪来的?让我们来稍微回溯下

        这个settings是一个对象,在之前的操作中已经从 settings.py 配置文件中获得了自身的属性。所以我们只需要去 settings.py 配置文件中寻找。

        我们来寻找这个 get_wsgi_application() 。

        它会再次调用 setup() ,重要的是,返回一个 WSGIHandler 类的实例。

        这就是wsgiapp本身。

       load_middleware() 为构建中间件堆栈,这也是wsgiapp获取setting信息的唯一途径。导入settings.py,生成中间件堆栈。

        如果看过我之前那篇fastapi源码的,应该对中间件堆栈不陌生。

        app入口→中间件堆栈→路由→路由节点→endpoint

        所以,wsgiapp就此构建完毕,服务器传入请求至app入口,即可经过中间件到达路由进行分发。

       django如何启动服务器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于部署django到服务器、django如何启动服务器的信息别忘了在本站进行查找喔。

Go并发编程:goroutine,channel和sync详解

       ä¼˜é›…的并发编程范式,完善的并发支持,出色的并发性能是Go语言区别于其他语言的一大特色。

       åœ¨å½“今这个多核时代,并发编程的意义不言而喻。使用Go开发并发程序,操作起来非常简单,语言级别提供关键字go用于启动协程,并且在同一台机器上可以启动成千上万个协程。

       ä¸‹é¢å°±æ¥è¯¦ç»†ä»‹ç»ã€‚

goroutine

       Go语言的并发执行体称为goroutine,使用关键词go来启动一个goroutine。

       go关键词后面必须跟一个函数,可以是有名函数,也可以是无名函数,函数的返回值会被忽略。

       go的执行是非阻塞的。

       å…ˆæ¥çœ‹ä¸€ä¸ªä¾‹å­ï¼š

packagemainimport("fmt""time")funcmain(){ gospinner(*time.Millisecond)constn=fibN:=fib(n)fmt.Printf("\rFibonacci(%d)=%d\n",n,fibN)//Fibonacci()=}funcspinner(delaytime.Duration){ for{ for_,r:=range`-\|/`{ fmt.Printf("\r%c",r)time.Sleep(delay)}}}funcfib(xint)int{ ifx<2{ returnx}returnfib(x-1)+fib(x-2)}

       ä»Žæ‰§è¡Œç»“果来看,成功计算出了斐波那契数列的值,说明程序在spinner处并没有阻塞,而且spinner函数还一直在屏幕上打印提示字符,说明程序正在执行。

       å½“计算完斐波那契数列的值,main函数打印结果并退出,spinner也跟着退出。

       å†æ¥çœ‹ä¸€ä¸ªä¾‹å­ï¼Œå¾ªçŽ¯æ‰§è¡Œæ¬¡ï¼Œæ‰“印两个数的和:

packagemainimport"fmt"funcAdd(x,yint){ z:=x+yfmt.Println(z)}funcmain(){ fori:=0;i<;i++{ goAdd(i,i)}}

       æœ‰é—®é¢˜äº†ï¼Œå±å¹•ä¸Šä»€ä¹ˆéƒ½æ²¡æœ‰ï¼Œä¸ºä»€ä¹ˆå‘¢ï¼Ÿ

       è¿™å°±è¦çœ‹Go程序的执行机制了。当一个程序启动时,只有一个goroutine来调用main函数,称为主goroutine。新的goroutine通过go关键词创建,然后并发执行。当main函数返回时,不会等待其他goroutine执行完,而是直接暴力结束所有goroutine。

       é‚£æœ‰æ²¡æœ‰åŠžæ³•è§£å†³å‘¢ï¼Ÿå½“然是有的,请往下看。

channel

       ä¸€èˆ¬å†™å¤šè¿›ç¨‹ç¨‹åºæ—¶ï¼Œéƒ½ä¼šé‡åˆ°ä¸€ä¸ªé—®é¢˜ï¼šè¿›ç¨‹é—´é€šä¿¡ã€‚常见的通信方式有信号,共享内存等。goroutine之间的通信机制是通道channel。

       ä½¿ç”¨make创建通道:

ch:=make(chanint)//ch的类型是chanint

       é€šé“支持三个主要操作:send,receive和close。

ch<-x//发送x=<-ch//接收<-ch//接收,丢弃结果close(ch)//关闭无缓冲channel

       make函数接受两个参数,第二个参数是可选参数,表示通道容量。不传或者传0表示创建了一个无缓冲通道。

       æ— ç¼“冲通道上的发送操作将会阻塞,直到另一个goroutine在对应的通道上执行接收操作。相反,如果接收先执行,那么接收goroutine将会阻塞,直到另一个goroutine在对应通道上执行发送。

       æ‰€ä»¥ï¼Œæ— ç¼“冲通道是一种同步通道。

       ä¸‹é¢æˆ‘们使用无缓冲通道把上面例子中出现的问题解决一下。

packagemainimport"fmt"funcAdd(x,yint,chchanint){ z:=x+ych<-z}funcmain(){ ch:=make(chanint)fori:=0;i<;i++{ goAdd(i,i,ch)}fori:=0;i<;i++{ fmt.Println(<-ch)}}

       å¯ä»¥æ­£å¸¸è¾“出结果。

       ä¸»goroutine会阻塞,直到读取到通道中的值,程序继续执行,最后退出。

缓冲channel

       åˆ›å»ºä¸€ä¸ªå®¹é‡æ˜¯5的缓冲通道:

ch:=make(chanint,5)

       ç¼“冲通道的发送操作在通道尾部插入一个元素,接收操作从通道的头部移除一个元素。如果通道满了,发送会阻塞,直到另一个goroutine执行接收。相反,如果通道是空的,接收会阻塞,直到另一个goroutine执行发送。

       æœ‰æ²¡æœ‰æ„Ÿè§‰ï¼Œå…¶å®žç¼“冲通道和队列一样,把操作都解耦了。

单向channel

       ç±»åž‹chan<-int是一个只能发送的通道,类型<-chanint是一个只能接收的通道。

       ä»»ä½•åŒå‘通道都可以用作单向通道,但反过来不行。

       è¿˜æœ‰ä¸€ç‚¹éœ€è¦æ³¨æ„ï¼Œclose只能用在发送通道上,如果用在接收通道会报错。

       çœ‹ä¸€ä¸ªå•å‘通道的例子:

packagemainimport"fmt"funccounter(outchan<-int){ forx:=0;x<;x++{ out<-x}close(out)}funcsquarer(outchan<-int,in<-chanint){ forv:=rangein{ out<-v*v}close(out)}funcprinter(in<-chanint){ forv:=rangein{ fmt.Println(v)}}funcmain(){ n:=make(chanint)s:=make(chanint)gocounter(n)gosquarer(s,n)printer(s)}sync

       sync包提供了两种锁类型:sync.Mutex和sync.RWMutex,前者是互斥锁,后者是读写锁。

       å½“一个goroutine获取了Mutex后,其他goroutine不管读写,只能等待,直到锁被释放。

packagemainimport("fmt""sync""time")funcmain(){ varmutexsync.Mutexwg:=sync.WaitGroup{ }//主goroutine先获取锁fmt.Println("Locking(G0)")mutex.Lock()fmt.Println("locked(G0)")wg.Add(3)fori:=1;i<4;i++{ gofunc(iint){ //由于主goroutine先获取锁,程序开始5秒会阻塞在这里fmt.Printf("Locking(G%d)\n",i)mutex.Lock()fmt.Printf("locked(G%d)\n",i)time.Sleep(time.Second*2)mutex.Unlock()fmt.Printf("unlocked(G%d)\n",i)wg.Done()}(i)}//主goroutine5秒后释放锁time.Sleep(time.Second*5)fmt.Println("readyunlock(G0)")mutex.Unlock()fmt.Println("unlocked(G0)")wg.Wait()}

       RWMutex属于经典的单写多读模型,当读锁被占用时,会阻止写,但不阻止读。而写锁会阻止写和读。

packagemainimport("fmt""sync""time")funcmain(){ varrwMutexsync.RWMutexwg:=sync.WaitGroup{ }Data:=0wg.Add()fori:=0;i<;i++{ gofunc(tint){ //第一次运行后,写解锁。//循环到第二次时,读锁定后,goroutine没有阻塞,同时读成功。fmt.Println("Locking")rwMutex.RLock()deferrwMutex.RUnlock()fmt.Printf("Readdata:%v\n",Data)wg.Done()time.Sleep(2*time.Second)}(i)gofunc(tint){ //写锁定下是需要解锁后才能写的rwMutex.Lock()deferrwMutex.Unlock()Data+=tfmt.Printf("WriteData:%v%d\n",Data,t)wg.Done()time.Sleep(2*time.Second)}(i)}wg.Wait()}总结

       å¹¶å‘编程算是Go的特色,也是核心功能之一了,涉及的知识点其实是非常多的,本文也只是起到一个抛砖引玉的作用而已。

       æœ¬æ–‡å¼€å§‹ä»‹ç»äº†goroutine的简单用法,然后引出了通道的概念。

       é€šé“有三种:

       æ— ç¼“冲通道

       ç¼“冲通道

       å•å‘通道

       æœ€åŽä»‹ç»äº†Go中的锁机制,分别是sync包提供的sync.Mutex(互斥锁)和sync.RWMutex(读写锁)。

       goroutine博大精深,后面的坑还是要慢慢踩的。

       æ–‡ç« ä¸­çš„脑图和源码都上传到了GitHub,有需要的同学可自行下载。

       åœ°å€ï¼šgithub.com/yongxinz/gopher/tree/main/sc

       ä½œè€…:yongxinz

怎么通过EXE猜测C语言的源代码?

       如果是没加壳的EXE文件的话,基本有两种工具:

       1、wdasm 静态反汇编工具,反汇编出来的是汇编代码,对汇编语言理解非常深刻的高手可能大概可以理解出某个函数内部的大概算法和思路。这种程度的,自己用汇编语言写个程序什么的估计也很轻松了。

       2、OllyDBG动态调试工具,这个相对上面的静态反汇编工具属于新工具,顾名思义,可以动态一步一步跟踪调试EXE文件执行的汇编代码。优点是可以动态的看到当前程序运行状态,包括内存中的数据,寄存器里面的当前数值等。

       其他工具就不太了解了。