我是Clojure的新手,并且一直在使用Compojure编写基本的Web应用程序.不过,我正在用Compojure的defroutes语法碰壁,我认为我需要理解它背后的"如何"和"为什么".
看起来像Ring样式的应用程序以HTTP请求映射开始,然后只是通过一系列中间件函数传递请求,直到它被转换为响应映射,然后将其发送回浏览器.对于开发人员来说,这种风格似乎太"低级",因此需要像Compojure这样的工具.我可以看到在其他软件生态系统中需要更多的抽象,尤其是Python的WSGI.
问题是我不了解Compojure的方法.我们采用以下defroutesS表达式:
(defroutes main-routes
(GET "/" [] (workbench))
(POST "/save" {form-params :form-params} (str form-params))
(GET "/test" [& more] (str "<pre>" more "</pre>"))
(GET ["/:filename" :filename #".*"] [filename]
(response/file-response filename {:root "./static"}))
(ANY "*" [] "<h1>Page not found.</h1>"))
Run Code Online (Sandbox Code Playgroud)
我知道理解所有这些的关键在于一些宏观伏都教,但我还没有完全理解宏(还).我已经盯着defroutes源头很长一段时间了,但就是不明白!这里发生了什么?理解"大创意"可能会帮助我回答这些具体问题:
workbench功能)中访问Ring环境?例如,假设我想访问HTTP_ACCEPT标头或请求/中间件的其他部分?{form-params :form-params})?在解构时我可以使用哪些关键字?我真的很喜欢Clojure,但我很难过!
在Python中,我可以编写一个排序比较函数,它返回集合中的项目{-1, 0, 1}并将其传递给排序函数,如下所示:
sorted(["some","data","with","a","nonconventional","sort"], custom_function)
Run Code Online (Sandbox Code Playgroud)
此代码将根据我在函数中定义的归类顺序对序列进行排序.
我可以在Postgres中做相同的操作吗?
例如
SELECT widget FROM items ORDER BY custom_function(widget)
Run Code Online (Sandbox Code Playgroud)
编辑:欢迎使用示例和/或指向文档的指针.
我正在用Python编写一个小型数据库适配器,主要是为了好玩.我试图让代码优雅地从MySQL连接"消失",即wait_timeout超出的情况中恢复.我已经准备好了wait_timeout,10所以我可以尝试一下.
这是我的代码:
def select(self, query, params=[]):
try:
self.cursor = self.cxn.cursor()
self.cursor.execute(query, params)
except MySQLdb.OperationalError, e:
if e[0] == 2006:
print "We caught the exception properly!"
print self.cxn
self.cxn.close()
self.cxn = self.db._get_cxn()
self.cursor = self.cxn.cursor()
self.cursor.execute(query, params)
print self.cxn
return self.cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)
接下来我等待十秒钟并尝试提出请求.这就是CherryPy的样子:
[31/Dec/2009:20:47:29] ENGINE Bus STARTING
[31/Dec/2009:20:47:29] ENGINE Starting database pool...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL... …Run Code Online (Sandbox Code Playgroud) 编辑完整源代码在这里:
http://code.seanwoods.com/reynard.fossil.cgi/artifact/0cc9cbfbe021c2ba86dcb4d0cf6ada52f0a80063
在这里拨打电话:
http://code.seanwoods.com/reynard.fossil.cgi/artifact/891405e62c95349aaf461dfb8ba82259f77fac9b
我有一个相对简单的内存分配失败.虽然它确实在几个地方分配内存,但应用程序并不是特别复杂.它是C,而不是C++.我很肯定这是一个分配内存的问题,而不是释放内存.
这是代码:
printf(":2 %d %d\n", initial_len, initial_len * sizeof(char));
o->data = (char*) malloc(initial_len * sizeof(char));
printf(":3 \n");
Run Code Online (Sandbox Code Playgroud)
执行后,我得到:
:1
:2 1024 1024
*** glibc detected *** ./menv: corrupted double-linked list: 0x0000000001d14400 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x76d76)[0x7f680cfc4d76]
/lib/x86_64-linux-gnu/libc.so.6(+0x771ed)[0x7f680cfc51ed]
/lib/x86_64-linux-gnu/libc.so.6(+0x794d4)[0x7f680cfc74d4]
/lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x70)[0x7f680cfc9b90]
./menv[0x403971]
./menv[0x40391d]
./menv[0x4030ec]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd)[0x7f680cf6cead]
./menv[0x401369]
======= Memory map: ========
00400000-00405000 r-xp 00000000 08:03 2621441 /home/swoods/code/reynard/modules/stdlib/menv
00605000-00606000 rw-p 00005000 08:03 2621441 /home/swoods/code/reynard/modules/stdlib/menv
00606000-00706000 rw-p 00000000 00:00 0
01cfd000-01d3d000 rw-p 00000000 00:00 0 [heap] …Run Code Online (Sandbox Code Playgroud) 这是一个关于宏的理论问题(我认为).我知道宏可以获取源代码并生成目标代码而无需对其进行评估,从而使程序员能够创建更多功能的语法结构.如果我必须对这两个宏系统进行分类,我会说有"C风格"宏和"Lisp风格"宏.
调试宏似乎有点棘手,因为在运行时,实际运行的代码与源代码不同.
调试器如何根据预处理的源代码跟踪程序的执行情况?是否有一个特殊的"调试模式"必须设置为捕获有关宏的额外数据?
在C中,我可以理解你为调试设置了一个编译时开关,但是解释语言(如某些形式的Lisp)会怎么做呢?
为不尝试这一点而道歉,但是lisp工具链需要的时间比我花费的时间要多.
我正在用Python的Queue.Queue类实现一个相对简单的线程池.我有一个包含Queue实例的生成器类以及一些便捷方法,以及一个子类的使用者类threading.Thread.我基于整数为我想要在池中的每个线程("工作线程",我认为它们被调用)实例化该对象.
每个工作线程flag, data取消队列,使用自己的数据库连接对其进行处理,并将行的GUID放在列表中,以便生产者类知道作业何时完成.
虽然我知道其他模块实现了我编码的功能,但我编码的原因是为了更好地理解Python线程的工作原理.这让我想到了我的问题.
如果我将任何东西存储在函数的命名空间或类的__dict__对象中,它是否是线程安全的?
class Consumer(threading.Thread):
def __init__(self, producer, db_filename):
self.producer = producer
self.conn = sqlite3.connect(db_filename) # Is this var thread safe?
def run(self):
flag, data = self.producer.queue.get()
while flag != 'stop':
# Do stuff with data; Is `data` thread safe?
Run Code Online (Sandbox Code Playgroud)
我认为两者都是线程安全的,这是我的理由:
__dict__都会创建一个新类.在上面概述的场景中,我认为任何其他对象都不会引用此对象.(现在,如果我使用join()功能,情况可能会变得更复杂,但我不是......)global,所以我不明白任何其他对象如何引用函数变量.这篇文章在某种程度上解决了我的问题,但对我来说仍然有点抽象.
在此先感谢您为我清理这个问题.
c ×2
python ×2
clojure ×1
compojure ×1
concurrency ×1
lisp ×1
macros ×1
malloc ×1
mysql ×1
namespaces ×1
postgresql ×1
sorting ×1