Python 线程启动但由于其他线程中的扭曲反应器而卡住(可能)

问题描述 投票:0回答:1

尝试基于扭曲的工作制作 API (https://github.com/spotware/OpenApiPy)

这是一个启动

twisted reactor
:

的工作代码
def onError(failure):
    print("Message Error: ", failure)

def connected(client):
    print("\nConnected")
    request = ProtoOAApplicationAuthReq()
    request.clientId = app_id
    request.clientSecret = app_secret
    deferred = client.send(request)
    deferred.addErrback(onError)

def disconnected(client, reason): # Callback for client disconnection
    print("\nDisconnected: ", reason)

def onMessageReceived(client, message): # Callback for receiving all messages
    print("Message received: \n", Protobuf.extract(message))

def send_messages():
    print('waiting for messages to send')
    while True:
        print(1)
        message = message_queue.get()

        deferred = client.send(message)
        deferred.addErrback(onError)
        time.sleep(10)

def send_message_thread(message):
    message_queue.put(message)

def main():
    client.setConnectedCallback(connected)
    client.setDisconnectedCallback(disconnected)
    client.setMessageReceivedCallback(onMessageReceived)
    client.startService()

    # send_messages()
    send_thread = threading.Thread(target=send_messages)
    send_thread.daemon = True  # The thread will exit when the main program exits
    send_thread.start()

    # Run Twisted reactor
    reactor.run()

if __name__ == "__main__":
    main()

连接成功,这是输出:

waiting for messages to send
1

Connected
Message received:
Message received:
Message received:
Message received:
...

所以看起来

send_thread
已启动,但随后
while True
实际上只执行了一次 - 有人知道为什么吗? (我猜它被
reactor.run()
挡住了,但我对这种扭曲的东西不熟悉)

如果

send_thread
正在运行,我想应该会打印更多
1

python python-multithreading twisted
1个回答
0
投票

您遗漏了

client
的定义,但从与之相关的名称(
deferred
addErrback
)来看,我猜测它是使用某些 Twisted API 的某些代码的接口。

几乎所有 Twisted API 都必须在 Reactor 运行的线程中使用。如果 API 在不同线程中使用是安全的,那么它将被明确标记。

从非 Reactor 线程调用时 Twisted API 的行为未指定。

如果您的代码在不同的线程中运行,并且您想使用其中的某些 Twisted 功能,则可以使用 reactor.callFromThreadblockingCallFromThread

© www.soinside.com 2019 - 2024. All rights reserved.