python * args **在

时间:2018-03-01 16:10:28

标签: python multithreading python-2.7 kwargs

所以我一直在python中使用* args ** kwargs功能一段时间,我遇到了一个问题,我似乎无法在stackoverflow上的文档/这里找到解决方案。

我有一个多线程作业,它并行地向服务器发送请求,然后对返回的JSON进行一些分析。我需要为每个请求 - 响应对写一个csv文件行。

因为这是并行完成的,所以在线程作业函数中写入csv会有问题。我想出的解决方案是将分析结果放在一个队列中,然后创建一个函数从que中分析中获取它并按顺序将其写入csv。

现在到了真正的问题: 我必须写入csv的函数接受参数和关键字参数,但是que不知道如何处理它。

有没有办法将* args ** kwargs放入一个que然后逐个获取它们并将它们传递给另一个函数?

我想要一些看起来像这样的东西:

csv_que = Queue() 

# put arguments to the que which will be written later  
def write_row_to_que(self,*args, **kwargs):
    csv_que.put(*args, **kwargs)

# send each argument in the que to the write_row function with the arguments 
#from the que
def csv_writer_func():
    while True:
        args, kwargs = csv_que.get()
        write_row(args, kwargs)

我不知道这是否是解决这个问题的正确方法,但我很想听到一些想法,如果这个功能(将参数传递给一个que然后从中拉出来)是可能的。

2 个答案:

答案 0 :(得分:1)

只需将实际对象作为元组传递,而无需解压缩它们:

csv_que = Queue() 

# put arguments to the que which will be written later  
def write_row_to_que(self,*args, **kwargs):
    csv_que.put((args, kwargs))

# send each argument in the que to the write_row function with the arguments 
#from the que
def csv_writer_func():
    while True:
        args, kwargs = csv_que.get()
        write_row(args, kwargs)

答案 1 :(得分:1)

这个mod应该足以让你入门:

def write_row_to_que(self,*args, **kwargs):
    csv_que.put( (args, kwargs) )

将参数放入元组中,另一端的get()方法将检索它们。

args, kwargs = csv_que.get()

此行将检索项目,但是:

  1. args将是未命名参数的元组。
  2. kwargs将是最初提供的关键字参数的字典。