尝试基于扭曲的工作制作 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
您遗漏了
client
的定义,但从与之相关的名称(deferred
、addErrback
)来看,我猜测它是使用某些 Twisted API 的某些代码的接口。
几乎所有 Twisted API 都必须在 Reactor 运行的线程中使用。如果 API 在不同线程中使用是安全的,那么它将被明确标记。
从非 Reactor 线程调用时 Twisted API 的行为未指定。
如果您的代码在不同的线程中运行,并且您想使用其中的某些 Twisted 功能,则可以使用 reactor.callFromThread 或 blockingCallFromThread。