TypeError при передаче аргументов потоку Python - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь написать простую программу потоков. Это хорошо работает, когда я не пытаюсь передать какие-либо переменные целевой функции.

import threading
import time
import datetime

def my_function():
    thread_start_time = str(datetime.datetime.now())
    thread_start_time_remove_microseconds = thread_start_time[:19]

    print("\n\nThread Execution Start Time: ", thread_start_time_remove_microseconds)
    print("I am being printed by mythread. Sleeping for 5 seconds. Main thread will wait till I finish")
    time.sleep(5)

    thread_end_time = str(datetime.datetime.now())
    thread_end_time_remove_microseconds = thread_end_time[:19]

    print("Thread Execution End Time: ", thread_end_time_remove_microseconds)


def main():
    mythread= threading.Thread(target=my_function, name="thread1")
    mythread.start()

    print("\n\n","=" * 31,"I am printed by the main thread","=" * 31,"\n\n")


if __name__ == "__main__":
    main()

, что приводит к:

Thread Execution Start Time: 

 2018-09-09 17:02:46
 =============================== I am printed by the main thread =============================== 


I am being printed by mythread. Sleeping for 5 seconds. Main thread will wait till I finish
Thread Execution End Time:  2018-09-09 17:02:51

Process finished with exit code 0

Однако, когда я пытаюсь передать переменную в функцию, я получаю ошибку ниже: импорт потоков время импорта дата импорта время

def my_function(one_variable):
    print(one_variable)
    thread_start_time = str(datetime.datetime.now())
    thread_start_time_remove_microseconds = thread_start_time[:19]

    print("\n\nThread Execution Start Time: ", thread_start_time_remove_microseconds)
    print("I am being printed by mythread. Sleeping for 5 seconds. Main thread will wait till I finish")
    time.sleep(5)

    thread_end_time = str(datetime.datetime.now())
    thread_end_time_remove_microseconds = thread_end_time[:19]

    print("Thread Execution End Time: ", thread_end_time_remove_microseconds)


def main():
    mythread= threading.Thread(target=my_function, name="thread1", args=("This is one variable from main"))
    mythread.start()

    print("\n\n","=" * 31,"I am printed by the main thread","=" * 31,"\n\n")


if __name__ == "__main__":
    main()

В результате получается:

=============================== I am printed by the main thread =============================== 


Exception in thread thread1:
Traceback (most recent call last):
  File "C:\Users\dparvez\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "C:\Users\dparvez\AppData\Local\Programs\Python\Python36-32\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
TypeError: my_function() takes 1 positional argument but 30 were given


Process finished with exit code 0

Может кто-нибудь помочь, пожалуйста, почему я получаю эту ошибку.

1 Ответ

0 голосов
/ 10 сентября 2018

вам нужна запятая, чтобы сделать args кортеж, например:

mythread= threading.Thread(
    target=my_function
    name="thread1",
    args=("This is one variable from main",))

Это потому, что threading.Thread () ожидает, что аргументы будут иметь значение итерируемое , и перечисляет его, чтобы все аргументы передавались в вашу функцию.

Выражение ("строка") равно просто "строке" - и оно является итеративным, в результате чего ("s", "t", "r", "i", "n", "g" ). Не то, что вы хотели. Чтобы сообщить Python, что ("string") является одноэлементным кортежем, а не выражением в скобках, выполните do ("string",).

...