将简单函数转换为多线程

我想在多线程中转换以下函数:

from __future__ import print_function
import os
import json


def url_searcher(value):
    url_file_path = "C:\\Users\\Link\\Desktop\\"

    for filename in os.listdir(url_file_path):
        if filename == "url_list.json":
            with open(url_file_path + filename) as f:
                for line in f:
                    returnJson = json.loads(line)
                    if value in returnJson["url"]:
                        return returnJson


print(url_searcher("http://zadkay.com/blog/wwp/51065983.jpg"))

基本上,它将在JSON file中搜索值。主要问题是文件很大(超过50mb),我需要尽可能快的结果(超过7秒被认为太多)。

这是文件的摘录,因此您可以看到结构:

{"dateadded": "2019-11-04 12:33:27","url_status": "online","tags": "elf","url": "http://2.56.8.16/bins/arm7","reporter": "Gandylyan1","threat": "malware_download","id": "251402"}
{"dateadded": "2019-11-04 12:33:25","url": "http://2.56.8.16/bins/arm6","id": "251401"}

问题:

有哪些步骤?这是个好主意,这会提高获得结果的速度吗?

在这里您可以看到JSON个文件示例,其中包含更多行:https://pastebin.com/MXYTg1CV

谢谢

leon_hit 回答:将简单函数转换为多线程

首先,测量而不是猜测。 熟悉snakeviz: https://jiffyclub.github.io/snakeviz/

pip install snakeviz
python -m cProfile -o program.prof my_program.py
snakeviz program.prof

在我的机器上,有5%的时间用于json库中decode的{​​{1}}函数中。

让我们尝试一个简单的改进:

decoder.py

在我的机器上,执行时间缩短了10倍。

,

在python中创建线程真的很简单

import threading

thread_one= threading.Thread(name='searcher',target=url_searcher,args=(value))                
thread_one.start()

https://docs.python.org/3/library/threading.html

但是我认为这不会减少处理时间,只会让您一次读取多个文件,甚至可能需要更长的时间来处理每个文件。

文件的结构总是一样的吗? 您是否尝试过将其作为纯文本文件处理并搜索键名?

,

看起来很像是I / O受限的操作:

from multiprocessing.dummy import Pool
from __future__ import print_function
from functools import partial
import json
import glob


def url_searcher(pathlist,value):

    for filename in pathlist:

         with open(filename) as f:

            for line in f:

                returnJson = json.loads(line)

                if value in returnJson["url"]:

                    return returnJson

no_of_threads = 4 #can be set manually or allocated automatically by Pool (see docs)

url_file_path = "C:\\Users\\Link\\Desktop\\"
value = "very_important_stuff" #adjust to your liking!

workers = Pool(no_of_threads)

pathlist = [f for f in glob.iglob(url_file_path,recursive=recurse) if "url_list.json" in f]

result = workers.map(partial(url_searcher,value = value),pathlist)

workers.close()       
workers.join()
本文链接:https://www.f2er.com/3161099.html

大家都在问