如何在 python 中从另一个 class 并行更新一个 class 的属性值?
How to update attribute value of one class from another class in parallel in python?
这是我在这里的第一个问题。问题主要是关于 Python 但有一点是关于编写加密货币交易机器人。我需要在我的机器人中计算一些关于交易的指标,如布林带、RSI 等。
指标是根据交易中的烛台数据计算得出的。烛台数据在其时间段内更新。例如,如果在 5 分钟内使用烛台数据,我需要每 5 分钟计算一次指标(在烛台更新后),或者如果我在 1 小时内使用烛台数据,我需要每 1 小时计算一次指标。
所以,认为我有两个 classes。一个以“TradeControl”命名,它有一个以“candlestick_data”命名的属性。第二个 class 以“CandlestickUpdater”命名。我想管理来自“CandlestickUpdater”class.
的“TradeControl”class 中“candlestick_data”的更新
我的问题是关于 python 中的并行进程(或线程)。我不知道如何以正确的方式做到这一点。这里有没有人给我一些建议或示例代码。而且我还想知道我是否应该使用类似互斥锁的结构来防止竞争条件等情况。
我想在代码中做的事情如下所示。另外,如果你有不同的建议,我愿意考虑。
class TradeControl():
def __init__(self):
self.candlestick_data = 0
def update_candlestick(self):
"""Candlesticks data will be requested from exchange and updated in here"""
pass
def run_trading_bot(self):
while True:
"""Main trading algorithm is running and using self.candlestick_data in here"""
pass
pass
pass
class CandlestickUpdater():
def __init__(self, controller: TradeControl):
self.controller = controller
def run_candlestick_updater(self):
while True:
"""Candlesticks data updates will be checked in here"""
if need_to_update:
"""TradeControl will be informed in here"""
self.controller.update_candlestick()
pass
pass
pass
pass
感谢您的回复,
根据您的描述,CandlestickUpdater
的用途不是很明显。看起来它的目的是通知 TradeControl
更新 candlestick_data
的时间到了,而更新逻辑本身在 TradeControl.update_candlestick
方法中。所以基本上 CandlestickUpdater
是一个计时器。
安排活动有不同的 python 库。 sched 例如。好像可以用来调度需要时间段的TradeControl.update_candlestick
方法
如果你仍然想要 CandlestickUpdater
class,我认为它实际上可以像你的代码中写的那样工作。您可以通过这种方式将这些 classes 添加到线程中:
from threading import Thread
trade_control = TradeControl()
candlestick_updater = CandlestickUpdater(controller=trace_control)
Thread(target=trade_control.update_candlestick).start()
Thread(target=candlestick_updater.run_candlestick_updater).start()
说到竞争条件。好吧,可能是这样,但这取决于您对 update_candlestick
和 run_trading_bot
的实现。最好创建 TradeControl.lock: threading.Lock
属性并在更新 candlestick_data
时使用它:https://docs.python.org/3/library/threading.html#lock-objects.
还有另一种不直接调用方法的线程间通信方式。看看blinker。这是实现 event-driven 场景的好库。您只需要创建一个“信号”对象(在 TradeControl
和 CandlestickUpdater
class 之外)并将 TradeControl.update_candlestick
方法连接到它。然后你只需调用“CandlestickUpdater.run_candlestick_updater”中的“signal.send”方法,连接的函数就会被执行。将实例方法连接到信号可能有点棘手。但是有一些解决方案。如果可能的话,最简单的方法是将 CandlestickUpdater.run_candlestick_updater
设置为静态。
Q :
" ... should (I) use mutex-like structures to guard against conditions like race condition "... ?
A :
鉴于事实,Python 口译员是如何工作的(从那时起,很可能永远,正如 Guido von Rossum 自己所表达的那样) 及其所有线程,分配 “工作许可” ~ 100 [ms] 时间量,通过中央 G-lobal I-ninterpreter L-lock (GIL-lock),没有race-conditions在 Python 见面(除非 software-created live-locks 或某些确实人为生成的相互阻塞的模糊不清)。
换句话说,所有 Python 解释器线程主要是 collision-free,因为 GIL-lock 将任何和所有线程重新 [SERIAL]
到 one-and-only-ONE-works -(如果-GIL-lock-所有者)-ALL-others-WAIT...
Q :
" My problem is about parallel process (or threading) in python. "
A :
线程永远不会在 Python 中“只是”-[CONCURRENT]
,所以永远不会形成 True-[= process-orchestration 的 12=] 形式。流程摆脱了 GIL-lock 重新 [SERIAL]
化的暴政,但要付出许多 add-on 成本和障碍才能转变为 distributed-processing
的新范式
如果Process-based[CONCURRENT]
-处理
恰好到场:
如果进入 process-based“只是”-[CONCURRENT]
-处理(使用 joblib.Parallel(...)delayed(...)
、multiprocessing
或其他模块),您将从尽可能多的独立(每个都在内部仍然 GIL-lock 驱动,但彼此独立 - 相互独立的 GIL-lock 保留的不协调自由)进程,top-down 副本(所有 Win,一些 MacOS)原始 Python 解释器(是的,由于 RAM-footprint + RAM-I/O 它是 [SPACE]
- 和 [TIME]
- 域昂贵)。
在这里你不能享受调用 local-process Class-method 或类似的传播机制 state-changes in-process,因为你的“接收者”可能驻留在原始 Python 解释器进程,它主要将 address-space 分开,你的 local-process 不能(也永远不会)被允许接触,它的一点变化都很少。
然而,我们可以在这里使用 distributed-computing 信号 and/or message-passing 的工具,例如 zeromq, pyzmq, nanomsg, pynng 等,满足您的需求,其中一些具有广泛的 Quant/Fintech 使用多种语言的安装基础 bindings/wrappers(我们在 python AI/ML-Ensemble-of-Predictors 中使用 ZeroMQ,因为 v2.11+,MQL4 用于驱动 FX-Broker XTO 和 MQL4 回测 simulation-farm, python non-blocking 分布式记录器, python 远程 CLI 代理, scale-out 多系统集成胶合逻辑的 C 语言工具, signal-provisioning 服务, subscriber-management, ... macro-system health-monitor & 报警系统)
上面的草图distributed-computing macro-system跨越了几个平台并且没有问题来处理sub-millisecond FX-market QUOTE
事件流的节奏,处理数万个 managed-trade 个位置(实时驾驶 FX-market XTO-modifications )并保持所有 QuantFX-technical 指标 re-calculations 动态。
建立自己的 event-responsive MVC-framework - 或 -
re-use 一个强大而稳定的 feature-rich :
说到上面,你可能re-use另一个概念,当生活在舒适的大把时间里,当进入H1-timeframe操作时。
查看 Tkinter.mainloop()
-示例,其中包含适用于 event-driven 和 timed-callbacks 的工具,这将允许您在您的想象力上限内进行任何操作,包括 GUI 和无限多Man-Machine-Interaction 模式和小工具的模式。
这是我在这里的第一个问题。问题主要是关于 Python 但有一点是关于编写加密货币交易机器人。我需要在我的机器人中计算一些关于交易的指标,如布林带、RSI 等。
指标是根据交易中的烛台数据计算得出的。烛台数据在其时间段内更新。例如,如果在 5 分钟内使用烛台数据,我需要每 5 分钟计算一次指标(在烛台更新后),或者如果我在 1 小时内使用烛台数据,我需要每 1 小时计算一次指标。
所以,认为我有两个 classes。一个以“TradeControl”命名,它有一个以“candlestick_data”命名的属性。第二个 class 以“CandlestickUpdater”命名。我想管理来自“CandlestickUpdater”class.
的“TradeControl”class 中“candlestick_data”的更新我的问题是关于 python 中的并行进程(或线程)。我不知道如何以正确的方式做到这一点。这里有没有人给我一些建议或示例代码。而且我还想知道我是否应该使用类似互斥锁的结构来防止竞争条件等情况。 我想在代码中做的事情如下所示。另外,如果你有不同的建议,我愿意考虑。
class TradeControl():
def __init__(self):
self.candlestick_data = 0
def update_candlestick(self):
"""Candlesticks data will be requested from exchange and updated in here"""
pass
def run_trading_bot(self):
while True:
"""Main trading algorithm is running and using self.candlestick_data in here"""
pass
pass
pass
class CandlestickUpdater():
def __init__(self, controller: TradeControl):
self.controller = controller
def run_candlestick_updater(self):
while True:
"""Candlesticks data updates will be checked in here"""
if need_to_update:
"""TradeControl will be informed in here"""
self.controller.update_candlestick()
pass
pass
pass
pass
感谢您的回复,
根据您的描述,CandlestickUpdater
的用途不是很明显。看起来它的目的是通知 TradeControl
更新 candlestick_data
的时间到了,而更新逻辑本身在 TradeControl.update_candlestick
方法中。所以基本上 CandlestickUpdater
是一个计时器。
安排活动有不同的 python 库。 sched 例如。好像可以用来调度需要时间段的TradeControl.update_candlestick
方法
如果你仍然想要 CandlestickUpdater
class,我认为它实际上可以像你的代码中写的那样工作。您可以通过这种方式将这些 classes 添加到线程中:
from threading import Thread
trade_control = TradeControl()
candlestick_updater = CandlestickUpdater(controller=trace_control)
Thread(target=trade_control.update_candlestick).start()
Thread(target=candlestick_updater.run_candlestick_updater).start()
说到竞争条件。好吧,可能是这样,但这取决于您对 update_candlestick
和 run_trading_bot
的实现。最好创建 TradeControl.lock: threading.Lock
属性并在更新 candlestick_data
时使用它:https://docs.python.org/3/library/threading.html#lock-objects.
还有另一种不直接调用方法的线程间通信方式。看看blinker。这是实现 event-driven 场景的好库。您只需要创建一个“信号”对象(在 TradeControl
和 CandlestickUpdater
class 之外)并将 TradeControl.update_candlestick
方法连接到它。然后你只需调用“CandlestickUpdater.run_candlestick_updater”中的“signal.send”方法,连接的函数就会被执行。将实例方法连接到信号可能有点棘手。但是有一些解决方案。如果可能的话,最简单的方法是将 CandlestickUpdater.run_candlestick_updater
设置为静态。
Q :
" ... should (I) use mutex-like structures to guard against conditions like race condition "... ?
A :
鉴于事实,Python 口译员是如何工作的(从那时起,很可能永远,正如 Guido von Rossum 自己所表达的那样) 及其所有线程,分配 “工作许可” ~ 100 [ms] 时间量,通过中央 G-lobal I-ninterpreter L-lock (GIL-lock),没有race-conditions在 Python 见面(除非 software-created live-locks 或某些确实人为生成的相互阻塞的模糊不清)。
换句话说,所有 Python 解释器线程主要是 collision-free,因为 GIL-lock 将任何和所有线程重新 [SERIAL]
到 one-and-only-ONE-works -(如果-GIL-lock-所有者)-ALL-others-WAIT...
Q :
" My problem is about parallel process (or threading) in python. "
A :
线程永远不会在 Python 中“只是”-[CONCURRENT]
,所以永远不会形成 True-[= process-orchestration 的 12=] 形式。流程摆脱了 GIL-lock 重新 [SERIAL]
化的暴政,但要付出许多 add-on 成本和障碍才能转变为 distributed-processing
如果Process-based[CONCURRENT]
-处理
恰好到场:
如果进入 process-based“只是”-[CONCURRENT]
-处理(使用 joblib.Parallel(...)delayed(...)
、multiprocessing
或其他模块),您将从尽可能多的独立(每个都在内部仍然 GIL-lock 驱动,但彼此独立 - 相互独立的 GIL-lock 保留的不协调自由)进程,top-down 副本(所有 Win,一些 MacOS)原始 Python 解释器(是的,由于 RAM-footprint + RAM-I/O 它是 [SPACE]
- 和 [TIME]
- 域昂贵)。
在这里你不能享受调用 local-process Class-method 或类似的传播机制 state-changes in-process,因为你的“接收者”可能驻留在原始 Python 解释器进程,它主要将 address-space 分开,你的 local-process 不能(也永远不会)被允许接触,它的一点变化都很少。
然而,我们可以在这里使用 distributed-computing 信号 and/or message-passing 的工具,例如 zeromq, pyzmq, nanomsg, pynng 等,满足您的需求,其中一些具有广泛的 Quant/Fintech 使用多种语言的安装基础 bindings/wrappers(我们在 python AI/ML-Ensemble-of-Predictors 中使用 ZeroMQ,因为 v2.11+,MQL4 用于驱动 FX-Broker XTO 和 MQL4 回测 simulation-farm, python non-blocking 分布式记录器, python 远程 CLI 代理, scale-out 多系统集成胶合逻辑的 C 语言工具, signal-provisioning 服务, subscriber-management, ... macro-system health-monitor & 报警系统)
上面的草图distributed-computing macro-system跨越了几个平台并且没有问题来处理sub-millisecond FX-market QUOTE
事件流的节奏,处理数万个 managed-trade 个位置(实时驾驶 FX-market XTO-modifications )并保持所有 QuantFX-technical 指标 re-calculations 动态。
建立自己的 event-responsive MVC-framework - 或 -
re-use 一个强大而稳定的 feature-rich :
说到上面,你可能re-use另一个概念,当生活在舒适的大把时间里,当进入H1-timeframe操作时。
查看 Tkinter.mainloop()
-示例,其中包含适用于 event-driven 和 timed-callbacks 的工具,这将允许您在您的想象力上限内进行任何操作,包括 GUI 和无限多Man-Machine-Interaction 模式和小工具的模式。