Python多进程传递字符串参数至类方法时被拆分为单个字符的原因排查
我正把类似ba4dfb43-46a6-44ec-9249-18bdf6621b01的字符串变量传递给VolumesParallel类中的strike方法,但在类内部调用该方法时,参数被拆分成了单个字符组成的元组,比如:('b', 'a', '4', 'd', 'f', 'b', '4', '3', '-', '2', '8', '7', '5', '-', '4', 'b', '8', 'd', '-', 'b', 'a', '5', 'd', '-', '1', '8', 'b', 'd', 'f', '6', '6', '2', '1', 'b', '0', '1', '\n')。
相关代码
进程调用代码
for item in run_list: print('item passing to processes1') print(item) # 此处item打印正常,类型为str p1 = Process(target=runclass.crowdstrike, args=(item))
类定义代码
# ========================== Main Class ============================= class VolumesParallel(object): # ============================= Multiprocessing CS CODE ====================================== def strike(self, *item): print('inside the class') print(item)
问题原因与解决办法
这问题其实是Python多进程Process类的args参数使用方式不对导致的,算是个很常见的小坑。
args要求传入的是一个元组,但你写args=(item)的时候,Python并不会把它当成元组——括号在这里只是用来分组表达式,实际传递的就是item本身(那个字符串)。而你的类方法strike用了*item这种可变参数,Python会把传入的可迭代对象(字符串本身就是字符的迭代器)拆成一个个元素,最终就变成了字符组成的元组。
解决办法很简单:
只需要在args里把单个元素写成带末尾逗号的元组,也就是把进程调用代码改成:
for item in run_list: print('item passing to processes1') print(item) # 此处item打印正常,类型为str p1 = Process(target=runclass.crowdstrike, args=(item,)) # 注意这里的逗号
那个末尾的逗号是关键,Python靠它来识别这是一个单元素元组,而不是普通的表达式分组。
另外提个小细节:你的类里定义的方法是strike,但进程调用的是runclass.crowdstrike,要确保这是同一个方法,避免笔误导致的其他问题哦。
内容的提问来源于stack exchange,提问作者yaarnick

