Bar.duck() # --------------------------------------------------------------------------- # TypeError Traceback (most recent call last) # <ipython-input-19-ddf54c241cc4> in <module>() # ----> 1 Bar.duck() # # TypeError: unbound method wrapped() must be called with Bar instance as first argument (got nothing instead)
from redis import Redis from sqlalchemy import select
import table # Mysql Table Object
redis_cli = Redis(xxxxxxxxxxx)
CUR = 0 MAX = 40000000
while CUR <= MAX: query = text("""SELECT id FROM example LIMIT CUR, 1000 ORDER BY id DESC""") result = table.execute(query).fetchall() pipe = redis_cli.pipeline() # 使用 pipeline 来减少连接开销 for item in result: pipe.set(item.id, 'foo') pipe.execute() CUR += 1000
开始执行大概下午 6 点左右,然后我就去吃饭逗猫写代码又睡了一觉。
上午 11 点左右来公司发现,才完成了 1000w 左右的数据,内心是崩溃的。。。。。
看了一眼 slow log,一次 Mysql 的查询需要 40s, 然后开始查一些资料找原因,发现 offset/limit 根本无法用到 index 机制,而是读整张表,然后数到需要便宜的位置,所以上面的代码到 1000w 时, mysql 会按照 id 的顺序逐条累加,一直找到第 1000w 的位置(至于为什么不通过 index 来直接找到 id 为 10000000 的数据,原因很简单,id 为 10000000 的数据并不已经代表是第 1000w 条数据,中间有可能会有数据被删除使得 id 非连续)。
找到了原因重写了一把脚本,把 offset 改成 where 就解决了这个问题,然后用了半个小时就跑完了数据- -。
其实,正确的来说,这个问题问的并没有切中要点,在最初的代码中,我们无法修改 l 的主要原因是 import 的特性导致
The from form does not bind the module name: it goes through the list of identifiers, looks each one of them up in the module found in step (1), and binds the name in the local namespace to the object thus found.
所以当你执行这个语句
1
from foo import l
本质是在当前的 Namespace 中声明了变量 l, 并将 l 指向 foo 这个 module 中的 l 所指向的对象。
当你执行 foo.bar() 的时候,将 foo 中的 l 改为了 20, 但是 main.py 中 l 扔指向 10,所以并没有实现夸文件修改. 同理,在 main.py 中修改 l 也不会影响 foo.l