2 czw913 czw913 于 2018.01.10 09:47 提问

Python多线程多进程问题

新手求问,刚学习python,发现在两个线程或两个进程开启后(都有一个while循环),必须要第一个执行完成,第二个才会执行,求问为什么会这样

 import threading
import time

class Test:
    def run(self):
        threading.Thread(target=self.func1()).start()
        threading.Thread(target=self.func2()).start()

    def func1(self):
        count = 0
        while count < 3:
            print("thread1")
            count += 1
            time.sleep(2)

    def func2(self):
        count = 0
        while count < 3:
            print("thread2")
            count += 1
            time.sleep(1)


if __name__ == "__main__":
    Test().run()
 import multiprocessing
import time

class Test:
    def run(self):
        multiprocessing.Process(target=self.func1()).start()
        multiprocessing.Process(target=self.func2()).start()

    def func1(self):
        count = 0
        while count < 3:
            print("thread1")
            count += 1
            time.sleep(2)

    def func2(self):
        count = 0
        while count < 3:
            print("thread2")
            count += 1
            time.sleep(1)


if __name__ == "__main__":
    Test().run()

执行结果:

 thread1
thread1
thread1
thread2
thread2
thread2

6个回答

u010127755
u010127755   2018.01.10 10:42
已采纳

你在函数传参时后面加了小括号就成函数调用了不是把函数当做参数传参
正确的代码:
import threading
import time

class Test:
def run(self):
threading.Thread(target=self.func1).start()
threading.Thread(target=self.func2).start()

def func1(self):
    count = 0
    while count < 3:
        print("thread1")
        count += 1
        time.sleep(2)

def func2(self):
    count = 0
    while count < 3:
        print("thread2")
        count += 1
        time.sleep(1)

if name == "__main__":
Test().run()

import multiprocessing
import time

class Test:
def run(self):
multiprocessing.Process(target=self.func1).start()
multiprocessing.Process(target=self.func2).start()

def func1(self):
    count = 0
    while count < 3:
        print("thread1")
        count += 1
        time.sleep(2)

def func2(self):
    count = 0
    while count < 3:
        print("thread2")
        count += 1
        time.sleep(1)

if name == "__main__":
Test().run()

u010127755
u010127755   2018.01.10 10:30

你打码写错了
def run(self):
multiprocessing.Process(target=self.func1()).start()
multiprocessing.Process(target=self.func2()).start()
multiprocessing.Process里面的target参数要求的是你要传入一个函数而你传入的是一个函数的返回值 而你这两个函数没有返回值所以默认为None所以你的多进程是没有启动的

WANJIAWEN1002
WANJIAWEN1002   2018.01.10 09:55

你启动的是进程,而且是阻塞的方式 而不是异步的方式。

czw913
czw913 请问怎么设置成非阻塞方式
9 天之前 回复
meng_ff
meng_ff   2018.01.10 09:55

开启异步线程执行,也许会好些

Phoenix_Lzy
Phoenix_Lzy   2018.01.10 14:27

def run(self):
threading.Thread(target=self.func1()).start()
threading.Thread(target=self.func2()).start()

这个地方写错了,threading.Thread() 中 target 接受的是函数名,
你写的 target=self.func1() 实际上是先求的 self.func1() 这个函数的值,
所以你看到了 thread1、thread1、thread1 的输出,
而你的函数 self.func1() 没有返回值,所以你这相当于创建了 threading.Thread(target=None).start() 这样一个线程,这个线程未被执行。
第二个线程和第一个一样,都是执行了你的函数,创建了一个空线程。

ronzhou18
ronzhou18   2018.01.10 16:38

threading.Thread(target=self.func1()).start()
threading.Thread(target=self.func2()).start()
这两行中func1()和func2()的()去掉即可,target传入的参数要的是函数名而不是函数调用,即改成:
threading.Thread(target=self.func1).start()
threading.Thread(target=self.func2).start()

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!