【问题标题】:Multithreading on object methods in pythonpython中对象方法的多线程
【发布时间】:2021-12-25 05:42:49
【问题描述】:

我正在尝试使用 oops 实现多线程


class test:
    def printer(self):
        for ctr in range(1000000):
            print("hello")

    def printHi(self):
        for ctr in range(1000000):
            print("hi")
            
if __name__ == "__main__":
    test1 = test()

    t1 = threading.Thread(target=test1.printHi, args=(10,))
    t2 = threading.Thread(target=test1.printer, args=(10,))
    t1.start()
    t2.start()
    print("Done!")

但是 test1.printHi 期望我通过 self

Exception in thread Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 973, in _bootstrap_inner
Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.9/threading.py", line 973, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.9/threading.py", line 910, in run
    self.run()
  File "/usr/lib/python3.9/threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)    self._target(*self._args, **self._kwargs)

TypeError: printHi() takes 1 positional argument but 2 were givenTypeError: 
printer() takes 1 positional argument but 2 were given
Done!

在传递 self 之后,它不再是多线程的它

t1 = threading.Thread(target=test1.printHi())
t2 = threading.Thread(target=test1.printer())
t1.start()
print("next")
t2.start()

它首先打印所有 hi 然后最后打印 hello ,但是当我像函数一样实现它们时,它们正常工作时它们会立即组合打印。什么是正确实现它的正确方法,以便两个线程同时运行......

【问题讨论】:

  • 在python中不能有两个循环同时工作,GIL只允许一个线程执行代码,另一个必须等​​待。
  • 如果你想同时执行两个循环,那么你应该使用多处理,它在内存方面有限制。
  • 正如jiri所指出的,你必须使用睡眠,这样如果你打算使用线程,GIL就会被转移。
  • 只有当你的任务在等待外部资源(如从磁盘或互联网读取)时,python 中的线程才能提高性能,其中 python 线程将在等待时释放 GIL,以便其他线程可以运行。

标签: python multithreading python-multithreading


【解决方案1】:

您似乎向方法传递了额外的 10 个;试试:


class test:
    def printer(self):
        for ctr in range(10):
            print("hello")
            time.sleep(1)

    def printHi(self):
        for ctr in range(10):
            print("hi")
            time.sleep(1)
            
if __name__ == "__main__":
    test1 = test()

    t1 = threading.Thread(target=test1.printHi, args=())
    t2 = threading.Thread(target=test1.printer, args=())
    t1.start()
    t2.start()
    print("Done!")

或者,如果你想保留参数,函数需要接受它:


class test:
    def printer(self, n):
        for ctr in range(10):
            print("hello", n)
            time.sleep(1)

    def printHi(self, n):
        for ctr in range(10):
            print("hi", n)
            time.sleep(1)
            
if __name__ == "__main__":
    test1 = test()

    t1 = threading.Thread(target=test1.printHi, args=(10,))
    t2 = threading.Thread(target=test1.printer, args=(10,))
    t1.start()
    t2.start()
    print("Done!")

【讨论】:

  • 新的错误信息是什么?
  • object.methodname 这给了我一个需要 self 的错误
  • object.methodname() 正在修复错误,但其行为不端的 hi 和 hello 没有立即打印出来
  • 您发布的所有错误都没有提到需要self...
  • object.methodname 会自动提供self,所以这可能不是问题...
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2012-09-27
  • 2021-10-29
  • 1970-01-01
  • 2021-11-23
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多