多线程或多进程

Posted

技术标签:

【中文标题】多线程或多进程【英文标题】:Multithread or multiprocess 【发布时间】:2021-10-21 19:36:42 【问题描述】:

所以,目前,我正在使用多处理来同时运行这 3 个功能。

由于只有tokens变化,是否建议切换到多线程? (如果是,它是否真的有助于提高性能,我认为内存肯定会减少使用)

这是我的代码:

from database_function import *
from kiteconnect import KiteTicker
import pandas as pd
from datetime import datetime, timedelta
import schedule
import time
from multiprocessing import Process



def tick_A():

    #credentials code here

    tokens = [x[0] for x in db_fetchquery("SELECT zerodha FROM script ORDER BY id ASC LIMIT 50")] #FETCHING FIRST 50 SCRIPTS TOKEN
    #print(tokens)

    ##### TO MAKE SURE THE TASK STARTS AFTER 8:59 ONLY ###########
    t = datetime.today()
    future = datetime(t.year,t.month,t.day,8,59)
    if ((future-t).total_seconds()) < 0:
        future = datetime(t.year,t.month,t.day,t.hour,t.minute,(t.second+2))
    time.sleep((future-t).total_seconds())
    ##### TO MAKE SURE THE TASK STARTS AFTER 8:59 ONLY ###########


    def on_ticks(ws, ticks):
        global ltp
        ltp = ticks[0]["last_price"]
        for tick in ticks:
          print(f"tick['instrument_token']A")
          db_runquery(f'UPDATE SCRIPT SET ltp = tick["last_price"] WHERE zerodha = tick["instrument_token"]') #UPDATING LTP IN DATABASE
          #print(f"tick['last_price']")


    def on_connect(ws, response):
        #print(f"response from connect :: response")
        # Subscribe to a list of instrument_tokens (TOKENS FETCHED ABOVE WILL BE SUBSCRIBED HERE).
        # logging.debug("on connect: ".format(response))
        ws.subscribe(tokens)
        ws.set_mode(ws.MODE_LTP,tokens) # SETTING TOKEN TO TICK MODE (LTP / FULL / QUOTE)

    kws.on_ticks = on_ticks
    kws.on_connect = on_connect
    kws.connect(threaded=True)

    #####TO STOP THE TASK AFTER 15:32 #######
    end_time = datetime(t.year,t.month,t.day,15,32)

    while True:
        schedule.run_pending()
        #time.sleep(1)
        if datetime.now() > end_time:
          break
    #####TO STOP THE TASK AFTER 15:32 #######


def tick_B():

everything remains the same only tokens value changes

    tokens = [x[0] for x in db_fetchquery("SELECT zerodha FROM script ORDER BY id ASC OFFSET (50) ROWS FETCH NEXT (50) ROWS ONLY")]


def tick_C():

everything remains the same only tokens value changes

    tokens = [x[0] for x in db_fetchquery("SELECT zerodha FROM script ORDER BY id ASC OFFSET (100) ROWS FETCH NEXT (50) ROWS ONLY")]




if __name__ == '__main__':
    def runInParallel(*fns):
      proc = []
      for fn in fns:
        p = Process(target=fn)
        p.start()
        proc.append(p)
      for p in proc:
        p.join()

    runInParallel(tick_A , tick_B , tick_C)

所以,目前,我正在使用多处理来同时运行这 3 个功能。

由于只有tokens变化,是否建议切换到多线程? (如果是,它是否真的有助于提高性能,我认为内存肯定会减少使用)

【问题讨论】:

您是否分析过您的代码以了解它的哪一部分真正花费了太多时间才能执行?你是 CPU 受限还是 IO 受限?基于此,您将决定是使用线程、异步还是多处理。 @alec_djinn 我认为 CPU 不会扮演太多角色,因为我正在从服务器获取价格 LTP 并将其添加到我的数据库中。 (每秒 10-20 笔交易) 那你应该使用 asyncio @alec_djinn 在尝试 asyncio 时得到 error 那很模糊。请发布您的代码和错误消息 【参考方案1】:

大多数 Python 实现没有真正的多线程,因为它们使用全局锁 (GIL)。所以一次只运行一个线程。 对于 I/O 繁重的应用程序,它不应该有所作为。但是,如果您需要并行完成 CPU 繁重的操作(我看到您使用 Panda - 所以答案必须是肯定的) - 您最好还是使用多进程应用程序。

【讨论】:

以上是关于多线程或多进程的主要内容,如果未能解决你的问题,请参考以下文章

进程池与线程池

进程池与线程池

2-10 进程池与线程池

协程(Coroutine)与多线程,多进程

多线程概念

python并发编程之进程池,线程池concurrent.futures