如何多线程一个从API调用返回数据的函数

时间:2017-03-18 05:08:52

标签: python multithreading

我试图从各种API请求数据。必须同时调用服务器,我知道我需要使用多线程但我无法弄清楚如何以我想要的方式返回数据,这是一个例子。

import requests
import time
import threading

t = time.strftime('%m/%d/%Y %H:%M:%S')
def getBitstamp():
    data = requests.get('https://www.bitstamp.net/api/ticker/')
    data = data.json()
    ask  = round(float(data['ask']),2)
    bid  = round(float(data['bid']),2)
    print 'bitstamp', time.strftime('%m/%d/%Y %H:%M:%S')
    return ask, bid

def getBitfinex():
    data = requests.get('https://api.bitfinex.com/v1/pubticker/btcusd')
    data = data.json()
    ask  = round(float(data['ask']),2)
    bid  = round(float(data['bid']),2)
    print 'finex', time.strftime('%m/%d/%Y %H:%M:%S')
    return ask, bid 

while True: 
    bitstampBid, bitstampAsk rate = thread.start_new_thread(getBitstamp)
    bitfinexAsk, bitfinexBid = thread.start_new_thread(getBitfinex)
    #code to save data to a csv
    time.sleep(1)
然而,似乎线程并不想返回多个(甚至任何值)我认为我误解了库是如何工作的。

EDIT已移除错误rate变量

1 个答案:

答案 0 :(得分:0)

您需要决定是否要使用高级Threading模块或低级thread。 如果稍后使用import thread而不是import threading

接下来,您还需要传递带有参数的元组以在thread中运行该函数。如果没有,你可以传递一个空元组,如下所示。

bitstampBid, bitstampAsk, rate = thread.start_new_thread(getBitstamp,())
bitfinexAsk, bitfinexBid = thread.start_new_thread(getBitfinex,())

程序现在执行,但是你可能想要调试单独的错误 以下是我注意到的几个错误 getBitstamp()返回rate,但是,getBitstamp()中未定义rate。编程错误。

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 

Traceback (most recent call last):
  File "C:\amPython\multiThreading1.py", line 28, in <module>
    bitstampBid, bitstampAsk = thread.start_new_thread(getBitstamp,())
TypeError: 'int' object is not iterable
>>> bitstamp 03/18/2017 00:41:33

有关多线程的一些想法已经过on this SO post讨论,可能对您有用。