【发布时间】: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