Python進級エッセイ【一】

5005 ワード

ここには筆者の小さな車輪が整理されていて、雑かもしれないし、基礎ではないかもしれませんが、あなたは帰ってきて私に感謝します.

動的関数呼び出し


応用背景:筆者はあるプロジェクトで、数千のスクリプトを調整して同時に使用する必要があります.私はすべての方法を書いて実行することはできません.数千のファイル名で私を混乱させることができます.だから、動的関数名で解決し、自動的に呼び出すしかありません.
#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+'
') 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()

メモリバッチスケジューリング


応用背景:上から見て、簡単に言って、下の2つの案を見てどんな違いがありますか?あるいはいっそ走ってみると、なぜ前者を使うのか分かります.
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は周知のように極めて簡単であるが,なぜシーケンス化と逆シーケンス化のメカニズムを導入するのか.理由は上に述べたように、複雑なリストで、リストが2次元や3次元で、さまざまな特殊な文字や辞書が挿入されている場合、以下の公知の方法は解決できますか?
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


以上が筆者の最近のエッセイとみられるので、順番や知識点は勝手ですが、やっている1匹は、幸いにもお役に立てたら嬉しいです.