首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我从键盘输入任何东西之后,我想在python中运行多个线程,而我在thread Thread-4中得到了这个错误--异常:

在我从键盘输入任何东西之后,我想在python中运行多个线程,而我在thread Thread-4中得到了这个错误--异常:
EN

Stack Overflow用户
提问于 2020-02-14 21:24:43
回答 1查看 113关注 0票数 0

在我从键盘输入任何东西之后,我想在python中运行多个线程,而我在thread Thread-4中得到了这个错误--异常:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-16 08:15:11

你应该发布整个回溯。这是我在所有4个线程中得到的结果:

代码语言:javascript
复制
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()传递了一个参数,而它不需要任何参数,所以在创建线程时不要传递参数:

代码语言:javascript
复制
t = threading.Thread(target=task, args=())

或者让task()接受一个参数:

代码语言:javascript
复制
def task(i):

在线程中请求输入也没有实际意义。没有提示,你就不会知道哪个线程在接受输入。

由于使用的是threading而不是multiprocessing模块,因此os.getpid()将在所有线程中返回相同的值。

此外,如果您在同一个循环中启动和连接线程,则不会获得任何并行性。在一个循环中启动所有线程,然后在另一个循环中加入(等待完成)。

这是一个演示并行性的解决方案:

代码语言:javascript
复制
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秒):

代码语言:javascript
复制
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的限制,但具有更长的进程初始化时间,并且参数通过进程间方法传递。

代码语言:javascript
复制
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()}')

输出:

代码语言:javascript
复制
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 2020
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60227244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档