wboayue/rust-ibapi

Cannot run concurrent IBAPI as thread safe

Closed this issue · 3 comments

If you try to run two threads to invoke Client::connect in order to connect two clients at the same time will produce an error, see below:

thread 'main' panicked at 'called Result::unwrap() on an Err value: Io(Error { kind: UnexpectedEof, message: "failed to fill whole buffer" })', src/main.rs:40:61
stack backtrace:
0: rust_begin_unwind
at /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/std/src/panicking.rs:578:5
1: core::panicking::panic_fmt
at /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/panicking.rs:67:14
2: core::result::unwrap_failed
at /rustc/90c541806f23a127002de5b4038be731ba1458ca/library/core/src/result.rs:1687:5
3: ibapi::main
note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.

Right now, you can't use a single instance of the client across multiple threads. That's a use case I decided not to handle. This might be a future enhancement. However, multiple threads with their own instance of the client is supported if they use distinct client ids.

Hi!

Can you provide a minimal code example of "multiple threads with their own instance of the client is supported if they use distinct client ids"?

Thanks a lot!

    use crossbeam::thread;
    use use ibapi::Client;

    thread::scope(|s| {
        for client_id in 100..103 {
            s.builder()
                .spawn(move |_| {
                    let client = Client::connect("127.0.0.1:4002", client_id)?;
                })
                .unwrap();
        }
    })
    .unwrap();