![](/img/trans.png)
[英]TypeError: cannot pickle '_thread.lock' object Dask compute
[英]Python process TypeError: cannot pickle '_thread.lock' object
这里有点撞墙。 基本上我有一个 python 程序可以从内部启动多个机器人,我试图将每个机器人作为一个单独的进程启动。 所以我创建了一个 class 来保存所有实例,以便我以后可以在需要时停止它们。
在那个 class 中,我有一个启动进程的方法。
def start_new_bot(self, bot_id, commission):
# Other things calculations...
trader = BotTrader(
bot=db_bot,
commission=commission,
symbol_filters=symbol_filters,
api_key=api_key,
api_secret=api_sec,
api_pass=api_pass,
)
process = Process(target=trader.start_trading)
self.instances.append(process)
process.start()
process.join()
我的 BotTrader class 看起来像这样:
class BotTrader():
def __init__(
self,
bot,
commission,
symbol_filters,
api_key,
api_secret,
api_pass="",
):
# Bot options
self.accumulate_wallet_profit = bot["accumulate_wallet_profit"]
for filter in symbol_filters:
if filter["filterType"] == "LOT_SIZE":
self.LOT_SIZE = filter["stepSize"].find("1") - 1
elif filter["filterType"] == "PRICE_FILTER":
self.STEP_SIZE = filter["tickSize"].find("1") - 1
self.trade_manager = TradeManager(
bot_obj=self.db_bot,
step_size=self.STEP_SIZE,
lot_size=self.LOT_SIZE,
commission=commission,
logger=self.logger,
)
self.orders = Orders(
exchange=bot["exchange"],
api_key=api_key,
api_secret=api_secret,
api_pass=api_pass,
step_size=self.STEP_SIZE,
lot_size=self.LOT_SIZE,
commission=commission,
)
# order book
self.orderbook_manager = OrderBookManager(
bot_obj=self.db_bot,
trade_symbol=self.TRADE_SYMBOL,
logger=self.logger,
)
def start_trading(self):
try:
websocket.enableTrace(False)
self.orderbook_manager.initialize()
socket_url = (
"wss://stream.binance.com:9443/ws/"
+ self.TRADE_SYMBOL.lower()
+ "@kline_"
+ self.INTERVAL
)
self.WEBSOCKET = websocket.WebSocketApp(
url=socket_url,
on_message=self.on_websocket_message,
on_error=self.on_error,
)
self.WEBSOCKET.run_forever()
except SysCallError as e:
sentry_sdk.capture_exception(e)
当 process.start() 被调用时,我得到错误TypeError: cannot pickle '_thread.lock' object不知道从哪里开始解决这个问题。
在我使用线程之前。 它奏效了,BotTrader 是一个守护线程
trader = BotTrader(
bot=db_bot,
commission=commission,
symbol_filters=symbol_filters,
api_key=api_key,
api_secret=api_sec,
api_pass=api_pass,
)
trader.start()
self.instances.append(trader)
class BotTrader(threading.Thread):
super(BotTrader, self).__init__()
self.daemon = True
def run(self):
try:
if self.bot_running:
self.start_trading()
except Exception as e:
sentry_sdk.capture_exception(e)
self.print_message(
f"Encountered fatal error in run method:
我会回避无法将BotTrader
实例发送到另一个进程的问题,只需在将要使用它的进程中创建它:
@staticmethod
def bot_proc_target(bot_id, commission):
trader = BotTrader(
bot=db_bot,
commission=commission,
symbol_filters=symbol_filters,
api_key=api_key,
api_secret=api_sec,
api_pass=api_pass,
)
trader.start_trading()
def start_new_bot(self, bot_id, commission):
# Other things calculations...
process = Process(target=self.bot_proc_target, args=(bot_id, commission))
self.instances.append(process)
process.start()
process.join()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.