线程“Thread-1”中没有当前事件循环

红外线

我对 python 很陌生,我正在尝试实现一个 API,用于从 Interactive Brokers Trader Workstation 请求一些数据。我正在使用 Flask 和ib_insync

这是我的代码:

import configparser
import json
import logging.config

from flask import Flask
from ib_insync import IB

flask = Flask(__name__)

ib = IB()

config = configparser.ConfigParser()
config.read('settings.ini')

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('ib-custom')


@flask.route('/health', methods=['GET'])
def health():
    return 'OK'


@flask.route('/summary', methods=['GET'])
def account_summary():
    logger.debug('account_summary called')
    summary = ib.accountSummary()
    return json.dumps([ob._asdict() for ob in summary])


if __name__ == '__main__':
    ib.connect('127.0.0.1', 7497, clientId=1)
    logger.info('Application started')
    flask.run(debug=True, use_reloader=False)

当我尝试执行时它会引发错误localhost:5000/summary这是堆栈跟踪:

Traceback (most recent call last):
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/main.py", line 27, in account_summary
    summary = ib.accountSummary()
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/ib_insync/ib.py", line 405, in accountSummary
    return self._run(self.accountSummaryAsync(account))
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/ib_insync/ib.py", line 310, in _run
    return util.run(*awaitables, timeout=self.RequestTimeout)
  File "/Users/irusanov/Projects/PycharmProjects/ib-custom/venv/lib/python3.8/site-packages/ib_insync/util.py", line 291, in run
    loop = asyncio.get_event_loop()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/asyncio/events.py", line 639, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Thread-1'.

为什么会出现这个错误?如何解决?

红外线

看起来 Flask 使用自己的内部阻塞/回调/线程模型,并且与该项目所基于的 Asyncio 不兼容。来源:https : //github.com/erdewit/ib_insync/issues/266

可以使用另一个框架而不是 Flask 来实现所需的行为。例如夸脱。

在使用 Quart 的情况下,可以重写此代码:

import asyncio
import configparser
import json
import logging.config
import nest_asyncio

from quart import Quart
from ib_insync import IB, util

nest_asyncio.apply()
qrt = Quart(__name__)

ib = IB()

config = configparser.ConfigParser()
config.read('settings.ini')

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('ib-custom')


@qrt.route('/health', methods=['GET'])
def health():
    return 'OK'


@qrt.route('/summary')
async def summary():
    with await IB().connectAsync() as ibi:
        acct = ibi.managedAccounts()[0]
        summary = ibi.accountSummary(acct)
        await ibi.accountSummaryEvent
        resp = json.dumps(util.tree(summary))
    return resp


@qrt.route('/pnl')
async def pnl():
    with await IB().connectAsync() as ibi:
        acct = ibi.managedAccounts()[0]
        pnl = ibi.reqPnL(acct)
        await ibi.pnlEvent
        resp = json.dumps(util.tree(pnl))
    return resp


if __name__ == '__main__':
    # ib.connect('127.0.0.1', 7497, clientId=1)
    logger.info('Application started')
    qrt.run(debug=True)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

RuntimeError:线程“ Thread-1”,多线程和异步错误中没有当前事件循环

多线程处理python时出现RuntimeError“ RuntimeError:线程'Thread-1'中没有当前事件循环。”

RuntimeError:线程“ Dummy-1”中没有当前事件循环

Python多线程没有当前事件循环

RuntimeError:异步+ Apscheduler中的线程中没有当前事件循环

尝试设置ipdb.set_trace():RuntimeError:线程'Thread -....'中没有当前事件循环。

Flask asyncio aiohttp-RuntimeError:线程“ Thread-2”中没有当前事件循环

Azure 函数错误线程中没有当前事件循环

在并发线程中运行加密提要:线程“ThreadPoolExecutor-0_0”中没有当前事件循环

在新循环上运行时,异常“线程'MainThread'中没有当前事件循环”

Python3 asyncio生成新线程时线程中没有当前事件循环

如何在单独的线程中运行 asyncio/websockets 服务器:错误:-> 线程中没有当前事件循环

Concurrent.futures + requests_html's render() = "在线程 'ThreadPoolExecutor-0_0' 中没有当前事件循环。"

如何获取当前线程的std :: thread?

我该如何解决错误“线程'主'在'没有当前反应堆'中惊慌'”的错误?

线程django-main-thread中的异常

错误:线程“ JavaFX Application Thread”中的异常

使用<thread>的C ++中的同时线程

具有std :: thread的多线程嵌套foor循环

Thread.sleep不休眠当前线程

扩展中的致命错误:PyThreadState_Get:在 Mac 上将 SWIG 与 Anaconda3 一起使用时没有当前线程

请问thread.start()方法的一个新的线程立即返回到当前线程?

c# Thread.sleep 睡眠当前线程还是主线程?

Java多线程,Thread.sleep会暂停当前线程,但不会继续其他线程

Thread.sleep(delay)对实际的并行线程有何反应

Thread.sleep()停止所有线程

thread_group中的一个线程不被中断

在std :: thread中joinable()然后join()是线程安全的吗?

MSDN引用的是system.thread,工作线程,I / O线程还是所有这三个线程?