Python进阶随笔【一】

这里整理了一些笔者的小轮子,可能比较杂,也可能并不基础,但是,你会回来感谢我的。

动态函数调用

应用背景:笔者有次项目,需要调几千个脚本用来做并发,我不可能每一个都要写个方法去执行,几千个文件名就能把我整懵逼了,所以只能动态函数名称来解决,自动调用。

#workindex.py
workindex={'task1':'result1'}
#task1.py
def run(username):
    if username=='rabbitmask':
        return 1
import task1
import taskindex

def work(username,workname):
    if eval(workname).run(username) == 1:
        return workindex['{}'.format(workname)]

work('rabbitmask','task1')

异步——多进程文件存储

应用背景:说到多进程并发存储,如果是数据库还好,但如果是文件,就会造成条件竞争,所以需要做异步调用。

def getinfo(j,k,q):
    pass
    q.put(j)
    return result

def saveinfo(result):
    for i in result:
        fw=open('result.txt','a')
        fw.write(i+'\n')
        fw.close()

def poolmana(keyword):
    p = Pool(10)
    q = Manager().Queue()
    for i in range(100000000/100):
        for j in range(i*100,i*100+100):
            p.apply_async(getinfo, args=(j+1, keyword,q),callback=saveinfo)
    p.close()
    p.join()

内存分批调度

应用背景:从上面看到了,简单提下,看下下面两个方案会有什么区别?或者干脆跑一下,你就晓得为什么要用前者了。

for i in range(100000000 / 100):
    for j in range(i * 100, i * 100 + 100):
        p.apply_async(getinfo, args=(j + 1, keyword, q), callback=saveinfo)

or

for i in range(100000000):
    p.apply_async(getinfo, args=(i + 1, keyword, q), callback=saveinfo)

Redis——Set存储非字符串

应用背景:笔者遇到了一个临时存储list的需求,redis自带list存储操作,但笔者的需求是整存一个复杂列表,测试之后发现极其不便,最终通过将数据json序列化之后以字符串的形式存储,读出并经过web传输后(刚好,因为列表也是没法直接传输的)后,再进行json反序列化,最终拿到的数据类型依然为list。

def redissaveinfo(timetoken,result):
    r.set(timetoken,result)

def redisgetinfo(timetoken):
    res=r.get(timetoken)
    return res

def save(timetoken): 
    res=['rabbit','carrot']
    list_str = json.dumps(res)
    redissaveinfo(timetoken,list_str)

def get(timetoken):
    res=redisgetinfo(timetoken)
    return res

def run(timetoken):
    res=get(timetoken)
    str_list =json.loads(res)
    return set_list

list-str互转

应用背景:显然,这个标题也是因为上面的需求拓展的,list_str众所周知可以说极其简单,为什么中间要在引入序列化与反序列化的机制呢?原因上面提到了,复杂列表,如果列表二维或三维,穿插着各种特殊字符和字典,下面的公知做法还能解决吗?

list = [1, 2, 3, 4, 5]
list_str=''.join(list)

str = '1,2,3,4,5'
str_list = str.split(",") 

异步——拉起非阻塞线程

应用背景:有的时候我们通过传参执行一项作业,至少对于当前请求并不关注他有没有结果,当前请求的任务就是把参数传达到即可,但如果因为后端作业复杂,并不能短时间内给出response,这我们并不能接受,因为我们并不想阻塞在这里等待回应。以上场景再前后端分离开发中Ajax常会遇到。

from concurrent.futures import ThreadPoolExecutor

def run(keyword):
    pass

@app.route('/API', methods=['POST'])
def API():
    username = request.form['keyword']
    executor.submit(run, keyword)
    result = {'status': 'Task Start!'}
    return jsonify(result)

多线程——返回值获取

应用背景:原生的多线程库并没有提供结果返回读取,而有的情景我们需要实时获取每个线程的return,可以通过方法重构完成。

#ThreadPlus.py
from threading import Thread

class MyThread(Thread):
    def __init__(self, func, args):
        super(MyThread, self).__init__()
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        try:
            return self.result
        except Exception:
            return None
from ThreadPlus import MyThread

def scan(keylword,timetoken):
    t1 = MyThread(task1.run, args=(keylword,))
    t2 = MyThread(task2.run, args=(keylword,))
    t3 = MyThread(task3.run, args=(keylword,))

    t1.setDaemon(True)
    t2.setDaemon(True)
    t3.setDaemon(True)

    for i in [t1, t2, t3]:
        i.start()

    for i in [t1, t2, t3]:
        i.join()

    res={'task1':t1.get_result() , 'task2':t2.get_result() , 'task3':t3.get_result()}
    return res

进程间通信——全局变量

应用背景:先吐槽一句,并发这个东西真的有意思,多线程需要防止线程间干扰所以需要线程同步,多进程因为相互独立又要实现进程间通信,难搞哦。笔者现在有一个索引值,需要搜集每个进程间的结果。

from multiprocessing import Manager,Pool

def getinfo(j,k,res,q):
    res.append('hello'+j+k)
    q.put(j)

def poolmana(keyword):
    res = Manager().list([])
    p = Pool(10)
    q = Manager().Queue()
    for i in range(10000/100):
        for j in range(i*100,i*100+100):
            p.apply_async(getinfo, args=(j+1, keyword,res,q))
    p.close()
    p.join()
    return res

END

以上是可以看作是笔者的近期随笔,所以顺序和知识点很随意,但干的一匹,如果有幸的话,很高兴能帮得到您。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358