Python Threading อาร์กิวเมนต์


156

ฉันมีปัญหากับ Python ที่เธรดและส่งสตริงในอาร์กิวเมนต์

def processLine(line) :
    print "hello";
    return;

.

dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();

โดยที่ dRecieved คือสตริงของหนึ่งบรรทัดที่อ่านโดยการเชื่อมต่อ มันเรียกฟังก์ชั่นที่เรียบง่ายซึ่ง ณ ตอนนี้มีงานพิมพ์เพียงหนึ่งงาน "hello"

อย่างไรก็ตามฉันได้รับข้อผิดพลาดดังต่อไปนี้

Traceback (most recent call last):
File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Python25\lib\threading.py", line 446, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: processLine() takes exactly 1 arguments (232 given)

232 คือความยาวของสายอักขระที่ฉันพยายามจะผ่านดังนั้นฉันเดาว่ามันแบ่งมันออกเป็นตัวละครแต่ละตัวและพยายามส่งผ่านข้อโต้แย้งแบบนั้น มันใช้งานได้ดีถ้าฉันเพิ่งเรียกฟังก์ชั่นตามปกติ แต่ฉันอยากจะตั้งมันเป็นเธรดแยกต่างหาก


49
ทำไมคุณมีเครื่องหมายอัฒภาคอยู่ท้ายบรรทัดแต่ละบรรทัด
Maikflow

@ Maikflow นั่นมันเป็นการฝึกที่ดีใช่ไหม? ASI แปลงบรรทัดที่ไม่ใช่อัฒภาคให้เป็นอัฒภาคในพื้นหลัง afaik
ฉัน IK

คำตอบ:


296

คุณกำลังพยายามสร้างสิ่งอันดับ แต่คุณเป็นเพียงแค่วงเล็บสตริง :)

เพิ่ม ',' พิเศษ:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,))  # <- note extra ','
processThread.start()

หรือใช้วงเล็บเพื่อสร้างรายการ:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved])  # <- 1 element list
processThread.start()

หากคุณสังเกตเห็นจากการติดตามสแต็ก: self.__target(*self.__args, **self.__kwargs)

การ*self.__argsเปลี่ยนสตริงของคุณให้เป็นรายการของอักขระส่งผ่านไปยังprocessLine ฟังก์ชัน หากคุณผ่านรายการองค์ประกอบหนึ่งรายการมันจะผ่านองค์ประกอบนั้นเป็นอาร์กิวเมนต์แรก - ในกรณีของคุณสตริง


1
วงเล็บพิเศษในตอนท้ายของบรรทัดที่สองของบล็อกรหัสที่สอง ฉันต้องการแก้ไข แต่น้อยกว่า 6 ตัวอักษร
harmonickey

หากคุณมี arg2 ที่มีค่าเริ่มต้นให้ทำเช่นนี้ threading.Thread(target=thread_function, args=(arg1,),kwargs={'arg2': arg2})
DeveScie

8

ฉันหวังว่าจะให้ความรู้พื้นฐานเพิ่มเติมที่นี่

ก่อนอื่นตัวสร้างลายเซ็นต์ของวิธีการเธรด :: เธรด :

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

argsเป็นอาร์กิวเมนต์ tupleสำหรับการร้องขอเป้าหมาย ค่าเริ่มต้นเป็น ()

ประการที่สองการเล่นโวหารใน Python เกี่ยวกับtuple:

tuples ที่ว่างเปล่าถูกสร้างขึ้นโดยวงเล็บที่ว่างเปล่า tuple ที่มีหนึ่งไอเท็มถูกสร้างขึ้นโดยทำตามค่าที่มีเครื่องหมายจุลภาค (ไม่เพียงพอที่จะใส่ค่าเดียวในวงเล็บ)

บนมืออื่น ๆ , 'abc'[1] == 'b'สตริงเป็นลำดับของตัวอักษรเช่น ดังนั้นหากส่งสตริงไปargsถึงแม้ในวงเล็บ (ยังคงเป็นเหล็กใน) ตัวละครแต่ละตัวจะถูกใช้เป็นพารามิเตอร์เดียว

อย่างไรก็ตาม Python นั้นถูกรวมเข้าด้วยกันและไม่เหมือนกับ JavaScript ที่สามารถยอมรับอาร์กิวเมนต์เพิ่มเติมได้ แต่มันเป็นการTypeErrorส่งข้อร้องเรียน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.