繁体   English   中英

多线程或多进程

[英]Multithread or multiprocess

因此,目前,我正在使用多处理来同时运行这 3 个函数。

由于只有令牌变化,是否建议切换到多线程? (如果是的话,它真的有助于像加速这样的性能吗,我认为内存肯定会使用得更少)

这是我的代码:

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 个函数。

由于只有令牌变化,是否建议切换到多线程? (如果是的话,它真的有助于像加速这样的性能吗,我认为内存肯定会使用得更少)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM