Python中的并发线程

时间:2015-04-17 12:41:13

标签: python multithreading

我遇到了让3个线程并发运行的问题。我希望“交易”循环,“价格”循环和“停止”循环同时运行,但似乎“停止”循环劫持程序并运行而其他人等待轮到他们。我应该如何设置它们以便它们同时运行?

import Queue
import threading
import time
import json

from execution import Execution
from settings import STREAM_DOMAIN, API_DOMAIN, ACCESS_TOKEN, ACCOUNT_ID
from strategy import TestRandomStrategy
from streaming import StreamingForexPrices
from event import TickEvent
from rates import stop



def trade(events, strategy, execution):
    """
    Carries out an infinite while loop that polls the
    events queue and directs each event to either the
    strategy component of the execution handler. The
    loop will then pause for "heartbeat" seconds and
    continue.
    """
    while True:
        try:
            event = events.get(False)
        except Queue.Empty:
            pass
        else:
            if event is not None:
                if event.type == 'TICK':
                    strategy.calculate_signals(event)
                elif event.type == 'ORDER':
                    print "Executing order!"
                    execution.execute_order(event)
        time.sleep(heartbeat)


if __name__ == "__main__":
    heartbeat = 0  # Half a second between polling
    events = Queue.Queue()

    # Trade 1000 unit of EUR/USD
    instrument = "EUR_USD"
    units = 1
    stopLoss = stopper




    # Create the OANDA market price streaming class
    # making sure to provide authentication commands
    prices = StreamingForexPrices(
        STREAM_DOMAIN, ACCESS_TOKEN, ACCOUNT_ID,
        instrument, events
    )
    #handle stopLoss price
    stopper = stop()

    # Create the execution handler making sure to
    # provide authentication commands
    execution = Execution(API_DOMAIN, ACCESS_TOKEN, ACCOUNT_ID)

    # Create the strategy/signal generator, passing the
    # instrument, quantity of units and the events queue
    strategy = TestRandomStrategy(instrument, units, events, stopLoss)

    # Create two separate threads: One for the trading loop
    # and another for the market price streaming class
    trade_thread = threading.Thread(target=trade, args=(events, strategy, execution))
    price_thread = threading.Thread(target=prices.stream_to_queue, args=[])
    rate_thread = threading.Thread(target=stop, args=[])

    # Start both threads
    trade_thread.start()
    price_thread.start()
    rate_thread.start()

只是fyi,一切都很好,直到我试图添加“率”。我添加的唯一内容是一个额外的线程,stopLoss和rate.py文件。

rate.py:

import oandapy
import time
oanda = oandapy.API(environment="practice", access_token="xxxxxxxxx")


while True:
    response = oanda.get_prices(instruments="EUR_USD")
    prices = response.get("prices")
    asking_price = prices[0].get("ask")
    stop = asking_price - .001
    print stop
    time.sleep(1)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

首先,一句话:

  • 如果可以避免,请不要使用sleep;例如,在" trade"循环你 如果您在队列中阻止.get(),则根本不需要睡觉

然后,一旦" rates.py"导入它会启动while循环;你'再 错过stop()功能(或您的代码未完成?)

编辑:以防你想在rates.py中添加stop函数, while块内的def stop():循环代码,如下所示

def stop():
    while True:
        response = oanda.get_prices(instruments="EUR_USD")
        prices = response.get("prices")
        asking_price = prices[0].get("ask")
        stop = asking_price - .001
        print stop
        time.sleep(1)

(顺便说一句:你真的知道你在做什么吗?)