有没有办法在python中的两个不同内核上同时运行多个进程?

Is there a way to run multiple processes on two different cores in python at the same time?

提问人:Alex Bergandine 提问时间:11/15/2023 最后编辑:Alex Bergandine 更新时间:11/15/2023 访问量:51

问:

我正在使用 tkinter 和 customtkinter 构建一个应用程序。我希望它每秒更新一次屏幕,但我希望它每 3 秒获取股票列表中某些股票的价格 .txt 而不是我希望它将该数据报告给 datarows.txt 中的表并根据股票的当前价格更新该表。由于屏幕每秒更新一次,我希望它每秒检查一次表格,看看它说的是股票的当前价格,并将其设置为屏幕上。我让它完全按照应有的方式工作,但是当它去雅虎财经检查股票价格时,每 3 秒就会滞后程序,使其在检查数据时无法使用大约一两秒钟。以下是所有代码:


from tkinter import END
import customtkinter
from PIL import Image
import time
from yahoo_fin import stock_info as si
import datetime
import subprocess
from multiprocessing import Process


customtkinter.set_appearance_mode("Dark")  # Modes: "System" (standard), "Dark", "Light"
customtkinter.set_default_color_theme("blue")  # Themes: "blue" (standard), "green", "dark-blue"



class App(customtkinter.CTk):
    def __init__(self):
        # Code for creating window
    #
    #

        def Refresher():
            lst = [("STOCK:", "PRICE:", "BUY/SELL:", "UP CONFIDENCE:", "DOWN CONFIDENCE:", "ACCURACY:"),
                   ("", "", "", "", "", "")]            
            with open("datarows.txt", "r") as data:
                data = data.readlines()
            for line in data:
                lists = []
                if len(line) > 10:
                    line = line.split(", ")
                    for string in line:
                        string = string.split("=")[1]
                        lists.append(string)
                    line = tuple(lists)
                    lst.append(line)
            total_row = len(lst)
            total_column = len(lst[0])
            for i in range(total_row):
                for j in range(total_columns):
                    self.e = customtkinter.CTkEntry(self.tabview.tab("Trading"))

                    self.e.grid(row=i, column=j, ipadx=50)
                    self.e.insert(END, lst[i][j])
            self.after(1000, Refresher)
        Refresher()

    def freshfit(self):
        global lst
        global total_rows
        global total_columns
        lst = [("STOCK:", "PRICE:", "BUY/SELL:", "UP CONFIDENCE:", "DOWN CONFIDENCE:", "ACCURACY:"),
               ("", "", "", "", "", "")]
        with open("datarows.txt", "r") as dat:
            dat = dat.readlines()
        for line in dat:
            thelist = []
            if len(line) > 10:
                line = line.split(", ")
                for strings in line:
                    string = strings.split("=")[1]
                    thelist.append(strings)
                line = tuple(thelist)
                lst.append(line)

        # find total number of rows and columns in list
        total_rows = len(lst)
        total_columns = len(lst[0])
        joe = []
        with open("stocks.txt", "r") as yeeter:
            yeet = yeeter.readlines()
            for line in yeet:
                line = line.strip("\n")
                stock = line
                with open("datarows.txt", "r") as dats:
                    daters = dats.readlines()
                    jake = []
                    for jim in daters:
                        jake.append(jim)
                        if stock in jim:
                            for bob in jake:
                                if stock in bob:
                                    live_prices = si.get_live_price(stock)
                                    bob = bob.split(", ")
                                    bob[1] = f"price={round(live_prices, 2)}"
                                    bob = ", ".join(bob)
                                    joe.append(str(bob) + "\n")
        with open("datarows.txt", "w") as writs:
            writs.write("")
        with open("datarows.txt", "a") as apens:
            for parts in joe:
                parts.strip("[[\n]]")
                apens.write(str(parts))
                lst.append(parts)
        self.after(3000, self.freshfit)



lst = [("STOCK:", "PRICE:", "BUY/SELL:", "UP CONFIDENCE:", "DOWN CONFIDENCE:", "ACCURACY:"),
                   ("", "", "", "", "", "")]
with open("datarows.txt", "r") as datas:
    datas = datas.readlines()
for line in datas:
    list = []
    if len(line) > 10:
        line = line.split(", ")
        for thestring in line:
            thestring= thestring.split("=")[1]
            list.append(thestring)
        line = tuple(list)
        lst.append(line)
# find total number of rows and columns in list
total_rows = len(lst)
total_columns = len(lst[0])


if __name__ == "__main__":
    app = App()
    p1 = Process(target=app.freshfit())
    p1.start()
    app.mainloop()

因此,如您所见,我尝试使用多处理来独立更新 freshfit 函数,但它仍然滞后于程序。freshfit 函数是抓取股票数据并将其插入到 datarows.txt 中的表中的函数,嵌套函数是每秒检查和更新屏幕的函数。我也意识到我的代码有些草率。我相信问题在于,即使使用多处理,它也会在同一内核上运行程序。我有一个 8 核 CPU,我相信由于它在同一内核上运行,因此无论如何它都会滞后于整个程序。我尝试了解多线程和multiprocessing.pool,但没有成功,这意味着我要么找不到实现它们的正确方法,要么它们无法解决此问题。有什么想法吗?

编辑:stocks.txt文件只是一个股票列表,所以每行都是不同的股票代码,如aapl,spy,pep等,该行上没有其他任何东西,目前stocks.txt文件有7只股票。datarows.txt 文件现在有 3 行,仅用于测试目的,但我最终会将所有股票添加到其中。这是其中一行的样子: 股票=AAPL,价格=186.96,买入/卖出=中性,上行置信度=85,下置度=15,准确性=75 股票.txt文件不会更改,保持绝对值,但是DataRows.txt文件保持不变,除了价格会根据该股票的实际当前价格实时更新。该程序这样做,但是每次它都会滞后 tkinter 窗口。

进程 处理 python-多线程

评论

0赞 Thomas Weller 11/15/2023
对不起,我到处阅读,因此我会立即离开。为变量指定有意义的名称。祝你好运。sssssss
0赞 Alex Bergandine 11/15/2023
修复了这个问题。我告诉过你代码很草率,不必考虑变量名称,让我专注于程序的功能。
2赞 Thomas Weller 11/15/2023
通常,情况正好相反。至少这是我在学生身上发现的。他们使用错误的、误导性的、草率的或单字符的变量名称,从而混淆自己。
0赞 Mark Setchell 11/15/2023
为什么要/为什么要写入磁盘上的文件?您从雅虎财经检索的数据量和类型是什么?
0赞 Alex Bergandine 11/15/2023
好吧,我正在尝试获取股票.txt列表中每只股票的当前股价,而不是我在datarows.txt文件中的列表,其中包括每只股票,其价格以及我将包含在我的程序中的其他几个因素。我正在使用 txt 文件来更新股票的当前价格,而不是使用嵌套函数刷新器尝试读取该文件并在屏幕上更新它 这一切都有效,但是它非常慢,因为每次它检查雅虎财经的股价时,它都会停止 tkinter 窗口大约一秒钟以下载该数据我试图同时下载它

答: 暂无答案