同时运行多个线程,但一一打印python?

时间:2019-01-19 07:55:15

标签: python multithreading python-multithreading

您可能已经知道我在说什么。因此,让我更清楚地解释一下。

例如:-我有四个运行模拟噪声的线程,诸如此类。

th1 = threading.Thread(target=connCheck,  args= (newurl, schemess, 21))
th2 = threading.Thread(target=connCheck,  args=( newurl, schemess, 22))
th3 = threading.Thread(target=connCheck,  args= (newurl, schemess,80))
th4 = threading.Thread(target=connCheck,  args=(newurl, schemess,8080))

(这是用于扫描端口号21、22、80、8080的扫描器。)

我这样运行这些线程:-

th1.start()
th2.start()
th3.start()
th4.start()
th4.join()

注意:-connCheck是用于告知哪些端口已打开的功能。

因此在我的终端中,这表明两个端口都以非常不好的方式打开了 BUT 。有时它会这样打印

List of port open:-

[+]21 [+]22 [+]80
[+]8080

打印出来的一些东西是这样的:-

List of port open:-

[+]21 
[+]22 [+]80
[+]8080

有时它会以其他方式打印。

所以我希望他们以像Line wise这样的单一好方式打印。但是要记住的最重要的一点是,我想同时运行上述所有线程,以免影响扫描速度。

所以我来这里问你。因此,请任何人在这里引导我。

谢谢

[EDIT]:-这是conncheck函数:-

try: 

        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(3)

        result = sock.connect_ex((ip, port))

        newip = schemess+ip+slash

        if port == 21:
            if result == 0:

                print "\t [+]" + str(port)
                ftpurls.append(newip)
                dicta(newip, port)


        else:
            if result == 0:


                    print '\t' + str(port)+ '\n'

                    dicta(newip, port)                      


        sock.close()
    except Exception as e:
        print str(e) + '\n'

请忽略dicta函数。

1 个答案:

答案 0 :(得分:0)

有几种方法可以使用锁,而另一种方法是使用logging模块。我一直在使用threading.Lock()编写多线程代码,但是最近发现logging更加易于使用。

lock = threading.Lock()
with lock:
     print("...")

with lock将在进入时调用lock.acquire(),在退出时将调用lock.release()。或者您可以手动调用这些。但是请确保在获得后release进行操作,否则将面临僵局。

另一种更简单的方法是使用我提到的logginglogging库是线程安全的,这意味着任何线程都可以同时使用这些函数。使用此模块还可以将日志写入日志文件。

import logging

logging.basicConfig(format='%(message)s')
logging.info("...")