Python 从请求处理程序将项添加到异步IO队列

Python 从请求处理程序将项添加到异步IO队列,python,concurrency,python-asyncio,pynetdicom,Python,Concurrency,Python Asyncio,Pynetdicom,我有一个正在运行的TCP服务器和一个处理函数,它需要获取请求的内容,将其添加到asyncio队列,并以OK状态回复 在后台,我运行了一个异步协同程序,它可以检测何时添加了一个新项并执行一些处理 如何从处理程序函数将项目放入异步IO队列中,该函数不是也不能是异步协程? 我正在运行一个DICOM服务器,它在端口104上侦听传入的TCP请求(DICOMC-STORE) 我需要将请求的内容保存到队列中,并返回一个0x0000响应,以便侦听器可用于网络 这是由生产者-消费者模式建模的 我试图定义一个消费者

我有一个正在运行的TCP服务器和一个处理函数,它需要获取请求的内容,将其添加到asyncio队列,并以OK状态回复

在后台,我运行了一个异步协同程序,它可以检测何时添加了一个新项并执行一些处理

如何从处理程序函数将项目放入异步IO队列中,该函数不是也不能是异步协程?

我正在运行一个DICOM服务器,它在端口104上侦听传入的TCP请求(DICOM
C-STORE

我需要将请求的内容保存到队列中,并返回一个
0x0000
响应,以便侦听器可用于网络

这是由生产者-消费者模式建模的

我试图定义一个消费者共同例程
consumer\u dicom()
,该例程当前卡在
wait queue.get()
中,因为我无法正确定义生产者

生产者只需调用
queue.put(production\u item)
,但这发生在
handle\u store(event)
函数中,该函数不属于
event\u循环
的一部分,而是在服务器每次收到请求时调用

导入异步IO
从pynetdicom导入(
AE,evt,
StoragePresentationContexts
)
类PacsServer():
Def.In ITITY*(自我,Par,Endo= True):
#初始化其他东西。。。
#初始化DICOM服务器
ae=ae(ae_title='DICOM-NODE')
ae.supported_contexts=StoragePresentationContexts
#当C-STORE请求到来时,它将被传递给self.handle\u存储
handlers=[(evt.evt\u C\u存储,self.handle\u存储)]
#定义队列
loop=asyncio.get\u event\u loop()
self.queue=asyncio.queue(loop=loop)
#定义消费者
loop.create_任务(self.consume_dicom(self.queue))
#使用指定的处理程序在后台启动服务器
self.scp=ae.start\u服务器((“”,104),block=False,evt\u handlers=handlers)
#启动异步循环
self.loop.run_forever()
def句柄存储(自身、事件):
#请求处理
ds=event.dataset
#这里我想添加到队列中,但这不是一个异步方法
等待队列。放置(ds)
返回0x0000
异步def消费dicom(自身、队列):
尽管如此:
打印(f“从队列等待”)
ds=等待队列。get()
进行一些数据处理(ds)

我想找到一种方法将项目添加到队列中,并在
handle\u store()
函数中返回OK状态。

由于
handle\u store
在另一个线程中运行,它需要通知事件循环将项目排队。这是通过以下方式完成的:


请注意,您需要调用而不是
queue.put
,因为前者是一个函数,而不是一个协程。对于无限队列(默认值),该函数将始终成功,否则如果队列已满,它将引发异常。

尝试将
等待队列.put(ds)
更改为
self.loop.call_soon\u threadsafe(queue.put_nowait,ds)
@user4815162342非常感谢!它工作完美,没有任何错误,这正是我所寻找的!
self.loop.call_soon_threadsafe(queue.put_nowait, ds)