Python 在同一程序中运行2个阻塞循环

Python 在同一程序中运行2个阻塞循环,python,loops,blocking,Python,Loops,Blocking,我想在同一个程序中运行2个阻塞循环。 在我的程序中,我使用nfqueue拦截数据包。创建队列时,它开始等待数据包并阻塞程序。当数据包到达时,它将调用cb()函数,然后再次开始侦听新数据包 这是我的节目: import nfqueue, socket from scapy.all import * import os os.system('iptables -t mangle -A PREROUTING -j NFQUEUE --queue-num 1') os.system('iptables

我想在同一个程序中运行2个阻塞循环。 在我的程序中,我使用nfqueue拦截数据包。创建队列时,它开始等待数据包并阻塞程序。当数据包到达时,它将调用cb()函数,然后再次开始侦听新数据包

这是我的节目:

import nfqueue, socket
from scapy.all import *
import os

os.system('iptables -t mangle -A PREROUTING -j NFQUEUE --queue-num 1')
os.system('iptables -t mangle -A POSTROUTING -j NFQUEUE --queue-num 2')


count = 0

def cb(payload):
    global count
    count +=1
    data = payload.get_data()
    p = IP(data) 

    print str(count) + ": TOS     = " + str(p.tos)
    payload.set_verdict(nfqueue.NF_ACCEPT)


def run_queue(queue_num):
    print "Preparing the queue"
    q = nfqueue.queue()
    q.open()
    q.unbind(socket.AF_INET)
    q.bind(socket.AF_INET)
    q.set_callback(cb)
    q.create_queue(queue_num)

    try:
        print "Running the queue"
        q.try_run()

    except KeyboardInterrupt, e:
        print "interruption"
        q.unbind(socket.AF_INET)
        q.close()


run_queue(1)
run_queue(2)
如何在同一个程序中运行2个或更多这样的阻塞循环

任何帮助都将不胜感激。
谢谢大家!

您可以在自己的线程中运行每个循环,如下所示:

import nfqueue, socket
from threading import Thread
from scapy.all import *
import os

os.system('iptables -t mangle -A PREROUTING -j NFQUEUE --queue-num 1')
os.system('iptables -t mangle -A POSTROUTING -j NFQUEUE --queue-num 2')


count = 0

def cb(payload):
    global count
    count +=1
    data = payload.get_data()
    p = IP(data) 

    print str(count) + ": TOS     = " + str(p.tos)
    payload.set_verdict(nfqueue.NF_ACCEPT)


def run_queue(queue_num):
    print "Preparing the queue"
    q = nfqueue.queue()
    q.open()
    q.unbind(socket.AF_INET)
    q.bind(socket.AF_INET)
    q.set_callback(cb)
    q.create_queue(queue_num)

    try:
        print "Running the queue"
        q.try_run()

    except KeyboardInterrupt, e:
        print "interruption"
        q.unbind(socket.AF_INET)
        q.close()

if __name__ == "__main__":
    t1 = Thread(target=run_queue, args=(1,))
    t1.start()
    t2 = Thread(target=run_queue, args=(2,))
    t2.start()
    t1.join()
    t2.join()

提示:您需要使用线程,并在单独的线程上运行每个循环,但是当创建第一个线程时,阻塞循环将启动,然后无法运行第二个线程created@HaTiMuX阻塞循环应该在它自己的线程中运行,所以它不会阻塞主线程的执行。@dano你能给我一个使用线程的基本示例吗?我尝试使用线程,但似乎我没有正确地使用它我得到了这个错误:q=nfqueue.queue()AttributeError:'module'对象没有属性'queue'@HaTiMuX你给你的文件命名了吗
nfqueue.py
?如果是,请将其重命名为其他名称。谢谢,问题确实出在文件名上。现在它可以工作了,只是第二个线程在第一个运行队列获得2个或3个数据包之前不会启动。有没有办法避免这种情况,同时启动两个线程???@HaTiMuX我真的不知道为什么会发生这种情况,除非是GIL造成的。您可以尝试使用
多处理.Process
而不是
线程.Thread
,看看问题是否消失。不过,您可能需要调整使用
count
变量的方式,以确保在进程之间安全共享。我只想在您测试它是否解决了问题时,将
count
注释掉。