2017-05-08 94 views
2
import time 
import datetime as dt 
import urllib.request 
from bs4 import BeautifulSoup 
import matplotlib.pyplot as plt 
import matplotlib.animation as Animation 
from matplotlib import style 
import matplotlib 
import csv 
import threading 

style.use('fivethirtyeight') 
fig = plt.figure() 


def usd_in_bitcoin(): 
    try: 
     resp = urllib.request.urlopen("https://bitcoinwisdom.com/") 
    except Exception as e: 
     print(e) 
    text = resp.read() 

    soup = BeautifulSoup(text, 'html.parser') 
    intermediate = soup.find('tr', {"id": "o_btcusd"}) 
    ans = intermediate.find('td', {'class': 'r'}) 
    return ans.contents[0] 


def write_to_file(interval): 
    while True: 
     value = str(usd_in_bitcoin()) 
     unix_time = str(time.time()) 
     print(unix_time, value) 
     with open('bitcoin_usd.csv', 'a+') as file: 
      file.write(unix_time) 
      file.write("," + str(value)) 
      file.write('\n') 
     time.sleep(interval) 


def animate(i): 
    with open('bitcoin_usd.csv') as csv_file: 
     readcsv = csv.reader(csv_file, delimiter=',') 
     xs = [] 
     ys = [] 
     for row in readcsv: 
      if len(row) > 1: 
       x, y = [float(s) for s in row] 
       xs.append(dt.datetime.fromtimestamp(x)) 
       ys.append(y) 
     print(len(xs)) 
     dates = matplotlib.dates.date2num(xs) 
     # print(dates) 
     fig.clear() 
     plt.plot_date(dates, ys) 


def plotting(): 
    ani = Animation.FuncAnimation(fig, animate, interval=1000) 
    plt.show() 


def main(): 
    # plotting() 
    b = threading.Thread(name='making graph', target=plotting) 
    # a = threading.Thread(name='updating_csv', target=write_to_file, args=(5,)) 

    # a.start() 
    b.start() 


if __name__ == '__main__': 
    main() 

在上面的代碼塊中,我試圖通過使用scraping來繪製比特幣的值,然後將值放在csv文件中。主線程不在線程模塊中的主循環錯誤

然後我讀取csv文件來繪製圖形。

無論是繪圖還是抓圖似乎都可以正常工作,但如果我同時執行這兩種操作,我會收到一條錯誤消息,說main thread not in main loop。我搜索了很多,但沒能解決這個問題

回答

0

這裏的問題是用線在main()

序列試試這個:

def main(): 
    a = threading.Thread(name='updating_csv', target=write_to_file, args=(5,)) 
    a.start() 
    b = threading.Thread(name='making graph', target=plotting) 
    b.start() 
    plotting()