Пытаетесь запустить несколько функций одновременно? - PullRequest
0 голосов
/ 06 мая 2020
• 1000 1003 *

У меня работает так, что всякий раз, когда происходит изменение цены, он показывает мне новую цену, но работает только с одной акцией, и, поскольку это происходит через некоторое время l oop, он не сломается и не двинется дальше на следующую акцию.

Я не хочу выпрыгивать из while l oop, потому что он перестанет отслеживать цену. Затем браузер закроется, и селен должен снова открыть его, если вы хотите увидеть новую цену, что займет больше времени.

Я пытаюсь создать функцию для каждой акции, которую хочу отслеживать.

I Кажется, не удается заставить его работать, что он будет контролировать более одной общей папки одновременно. Я пробовал использовать многопоточность, но затем показывается цена только одной акции.

Извините за все импортированные библиотеки, которые я только что экспериментировал

Любая помощь будет принята с благодарностью.

import requests
import time
import tkinter

from selenium import webdriver
import time
from selenium.webdriver.firefox.options import Options
global driver
import threading
from multiprocessing import *
import os



options = Options()
options.headless = True
driver = webdriver.Firefox(options = options, executable_path=...driver path...)
counter_for_mtn = 0 # I only use counter for printing the first price


def MTN():#mtn is the name of the share
      global counter_for_mtn
      url = 'https://www.google.com/search?q=mtn+shares&safe=strict&sxsrf=ALeKk02Dyba3hHbg1S4YeLOFhw4FPfhqdQ:1588770127528&source=lnms&tbm=fin&sa=X&ved=2ahUKEwjl2dL4pZ_pAhUMZMAKHU1WDGAQ_AUoAXoECBkQAw&biw=1920&bih=969#scso=_XLWyXpmmE8uEhbIPpf-ooAY1:0'
      driver.get(url)
      while True:
             value_mtn = driver.find_element_by_xpath('/html/body/div[6]/div[2]/div[9]/div[1]/div[2]/div/div[2]/div[2]/div/div/div/div/div/sticky-header/div[2]/div/div[1]/div/div[1]/div/div/div/div/div/div/g-card-section/div/g-card-section/span[1]/span/span[1]').text
             if counter_for_mtn == 0:
                   print('MTN: '+ str(value_mtn))
                   counter_for_mtn =1


             try:
                  if mtn_old_price != value_mtn:
                  print('MTN: '+str(value_mtn))
             except:
                   pass

             mtn_old_price = value_mtn


counter_for_sasol = 0#only use counter to print out the first price

def Sasol():#sasol is the name of the share
     global counter_for_sasol

     url = 'https://www.google.com/search?q=sasol+shares&safe=strict&sxsrf=ALeKk004QjkQ84tFd8TP8ikaQc3yhNRkrQ:1588772136446&source=lnms&tbm=fin&sa=X&ved=2ahUKEwjpkMm2rZ_pAhV4Q0EAHZ7jCWEQ_AUoAXoECBkQAw&biw=1920&bih=969'
     driver.get(url)

     while True:
           value = driver.find_element_by_xpath('/html/body/div[6]/div[2]/div[9]/div[1]/div[2]/div/div[2]/div[2]/div/div/div/div/div/sticky-header/div[2]/div/div[1]/div/div[1]/div/div/div/div/div/div/g-card-section/div/g-card-section/span[1]/span/span[1]').text
           if counter_for_sasol == 0:
               print('SASOL: ' + str(value))
               counter_for_sasol = 1

           try:
               if old_price != value:
                   print('SASOL: ' + str(value))
           except:
               pass

           old_price = value






thread1 = threading.Thread(target = MTN())
thread1.start()
thread2 = threading.Thread(target = Sasol())
thread2.start()

1 Ответ

0 голосов
/ 07 мая 2020

как мне заставить обе функции Sasol () и MTN () работать в одно и то же время?

Это работает (с использованием игрушечных функций), хотя технически я не уверен вы можете сказать, что они работают в точно в одно и то же время:

import sys,time,threading,random

def f():
    for i in range(10):
        print(f'{i}:f',file=sys.stdout)
        time.sleep(random.random())
def g():
    for i in range(10):
        print(f'{i}:g',file=sys.stdout)
        time.sleep(random.random())

if __name__ == '__main__':
    threads = [threading.Thread(target=func) for func in [f,g]]
    for t in threads:
        t.start()

Это также работает - используя одну функцию, передающую разные аргументы каждому thread - в вашем случае аргумент (ы) будет уникальной строкой (ами), указывающей c на то, что вы хотите получить.

import sys,time,threading,random

def f(s):
    for i in range(10):
        print(f'{i}:{s}',file=sys.stdout)
        time.sleep(random.random())

if __name__ == '__main__':
    threads = [threading.Thread(target=f,args=(arg,)) for arg in ['one','two']]
    for t in threads:
        t.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...