在我从键盘输入任何东西之后,我想在python中运行多个线程,而我在thread Thread-4中得到了这个错误--异常:
import threading
import os
import cv2
def task():
user_input = input()
print(user_input)
print("Task assigned to thread: {}".format(threading.current_thread().name))
print("ID of process running task : {}".format(os.getpid()))
print("Thread started now")
if __name__ == "__main__":
for i in range(1, 5):
# Instantiates the thread
t = threading.Thread(target=task, args=(i,))
t.start()
t.join()发布于 2020-02-16 08:15:11
你应该发布整个回溯。这是我在所有4个线程中得到的结果:
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Python38\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:Python38\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
TypeError: task() takes 0 positional arguments but 1 was given它告诉函数task()传递了一个参数,而它不需要任何参数,所以在创建线程时不要传递参数:
t = threading.Thread(target=task, args=())或者让task()接受一个参数:
def task(i):在线程中请求输入也没有实际意义。没有提示,你就不会知道哪个线程在接受输入。
由于使用的是threading而不是multiprocessing模块,因此os.getpid()将在所有线程中返回相同的值。
此外,如果您在同一个循环中启动和连接线程,则不会获得任何并行性。在一个循环中启动所有线程,然后在另一个循环中加入(等待完成)。
这是一个演示并行性的解决方案:
import threading
import os
import time
def task(i):
print(f'Task#{i} started in {threading.current_thread().name}')
time.sleep(5) # do some "work"
print(f'Task#{i} done')
threads = [threading.Thread(target=task,args=(i,)) for i in range(1,5)]
print(f'Start: {time.ctime()}')
for t in threads:
t.start()
for t in threads:
t.join()
print(f'End: {time.ctime()}')输出(注意开始和结束时间相差5秒):
Start: Sat Feb 15 16:22:59 2020
Task#1 started in Thread-1
Task#2 started in Thread-2
Task#3 started in Thread-3
Task#4 started in Thread-4
Task#1 done
Task#2 done
Task#4 done
Task#3 done
End: Sat Feb 15 16:23:04 2020最后注意:由于CPython的全局解释器锁( GIL )实现,一个进程一次只能在一个线程中运行Python代码,因此threading模块不会为Python密集型工作节省时间,但在Python等待I/O或调用释放GIL的本地C模块时非常有用。multiprocessing模块可用于创建多个Python进程,这些进程不受GIL的限制,但具有更长的进程初始化时间,并且参数通过进程间方法传递。
import multiprocessing as mp
import os
import time
def task(i):
print(f'Task#{i} started in {mp.current_process().name}')
time.sleep(5)
print(f'Task#{i} done')
if __name__ == '__main__':
processes = [mp.Process(target=task,args=(i,)) for i in range(1,5)]
print(f'Start: {time.ctime()}')
for p in processes:
p.start()
for p in processes:
p.join()
print(f'End: {time.ctime()}')输出:
Start: Sat Feb 15 16:32:26 2020
Task#4 started in Process-4
Task#3 started in Process-3
Task#1 started in Process-1
Task#2 started in Process-2
Task#1 done
Task#4 done
Task#3 done
Task#2 done
End: Sat Feb 15 16:32:31 2020https://stackoverflow.com/questions/60227244
复制相似问题