我正在尝试编写一个Python库,它将实现某个聊天协议的客户端.
连接到服务器后,
我启动主循环,从服务器读取并处理收到的命令,这里我需要调用回调函数(如on_message或on file_received等).
我应该怎么做呢?
应该为每个回调函数启动一个新线程吗?也许一些回调需要一些时间才能返回,我会暂停.
另外,
如果我从服务器读取的主循环在一个线程中,我可以从另一个线程写入套接字(向服务器发送消息)吗?
还是有更好的方法?谢谢.
我想在解释器中使用原子操作在两个线程之间共享一个变量,如http://effbot.org/zone/thread-synchronization.htm所述.核心数据类型的简单赋值(单字节码操作)应该是线程安全的,因为python <3.2中的GIL.到目前为止理论.以下代码可以在主模式或从模式下运行(-m或-s).主模式通过UDP不断发送数据.从模式确实创建了一个线程来从udp端口读取数据并更新每个接收到的数据包上的变量.
示例代码将共享变量作为参数传递给创建时的线程.我也尝试过使用全局变量或将线程本地存储传递给线程.
结果是一样的.在read_time_master线程内部,变量被赋值.但是在主线程中,共享变量的值不会更新.
#!/usr/bin/env python
import socket
import itertools
import multiprocessing
from optparse import OptionParser
from time import sleep
PORT = 1666
def read_time_master(sock, time_master):
while True:
time_master = float(sock.recvfrom(1024)[0])
def main():
time_master = 0.0
p = OptionParser()
p.add_option('--master', '-m', action='store_true')
p.add_option('--slave', '-s', action='store_true')
options, arguments = p.parse_args()
if options.master or options.slave:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
if options.master:
sock.connect(('127.0.0.1', PORT))
if options.slave:
sock.bind(('0.0.0.0', PORT))
recv_thread = multiprocessing.Process(target=read_time_master, args=(sock, time_master))
recv_thread.start()
for time in itertools.count():
print time …Run Code Online (Sandbox Code Playgroud) 我可以让我的物体停下来.一旦我按下w,a,s或d它就会移动但不会停止.当我按下其中一个方向时它会移动但它不会停止.当我释放钥匙时,我需要它停止.所有类型的帮助将不胜感激.继承我的代码:
while (running == 1):
screen.fill(white)
for event in pygame.event.get():
if (event.type == pygame.QUIT):
running = 0
elif (event.type == pygame.KEYDOWN):
if (event.key == pygame.K_d):
dir = "R"
elif (event.key == pygame.K_a):
dir = "L"
elif (event.key == pygame.K_s):
dir = "D"
elif (event.key == pygame.K_w):
dir = "U"
elif (event.key == pygame.K_ESCAPE):
sys.exit(0)
elif (event.key == pygame.K_SPACE):
shot=True
xbul=xgun
ybul=ygun
#if key[K_SPACE]:
#shot = True
#OBJECT'S MOVEMENTS
if (dir == "R" and xgun<595):
xgun = xgun + 3
pygame.event.wait …Run Code Online (Sandbox Code Playgroud) 我使用的是Python 2.7.
这就是发生的事情:
>>> 2+++2
4
Run Code Online (Sandbox Code Playgroud)
我不确定python解释器如何解释这个表达式.
我能想出的唯一原因是在第一个"+"之后的连续"+"被认为是一元运算符而第一个"+"被认为是二元运算符,但实际上正在发生的机制我不是肯定.
我希望有人能够根据Python编程语言的语法细节来回答这个问题,并报告其他一些含糊不清的表达方式.我想出了下面列出的一些其他表达式(结果):
>>> 2------------2
4
>>> 2+-2+-2+-2+-2+-2-------------------------2
-10
Run Code Online (Sandbox Code Playgroud) 我刚开始学习pygame图形.我在pygame中画了一个圆圈,想知道我是如何编程来改变颜色的.
例如:它将颜色从蓝色更改为红色.
我需要它来改变颜色,直到我关闭pygame,如果颜色逐渐从一个变为另一个而不是瞬间改变,那将会很好吗?我有什么想法可以做到这一点?
import pygame
pygame.init()
RED = (255, 0, 0)
BLUE = ( 0, 0,255)
BLACK = ( 0, 0, 0)
SIZE = (1000,1000)
screen = pygame.display.set_mode(SIZE)
pygame.draw.circle(screen,RED,(500,500),200)
pygame.display.flip()
pygame.time.wait(3000)
pygame.quit()
Run Code Online (Sandbox Code Playgroud) >>> from bs4 import BeautifulSoup as bs
>>> html = """<html>
<head><title>Test</title></head>
<body>
<p><b>para1</b><\p>
<p><b>para2</b><\p>
</body>
</html>"""
>>>
>>> soup = bs(html)
>>> html == str(soup)
False
>>> print html
<html>
<head><title>Test</title></head>
<body>
<p><b>para1</b><\p>
<p><b>para2</b><\p>
</body>
</html>
>>> print soup
<html>
<head><title>Test</title></head>
<body>
<p><b>para1</b><\p>
<p><b>para2</b><\p>
</p></p></body>
</html>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,html和str(soup)... 之间存在差异.
< became <
> became >
Run Code Online (Sandbox Code Playgroud)
为什么会这样?